首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq- to -SQL:正在尝试创建实体的新版本,但get“无法添加已存在的实体”

Linq- to -SQL:正在尝试创建实体的新版本,但get“无法添加已存在的实体”
EN

Stack Overflow用户
提问于 2013-04-15 20:00:48
回答 2查看 91关注 0票数 0

我有下面的表格

代码语言:javascript
复制
[TestModule]
ProductId uniqueidentifier primarykey
ModuleId uniqueidentifier primarykey
LastEdited timestamp primarykey
LastEditor uniqueidentifier
LastEditComment nvarchar(200)
CheckedOutTo uniqueidentifier
... other fields ...

该类的定义如下:

代码语言:javascript
复制
    [Column(IsPrimaryKey=true)]
    public Guid ProductGuid { get; private set; }

    [Column(IsPrimaryKey = true)]
    public Guid ModuleGuid { get; private set; }

    /// <summary>
    /// date of last edit
    /// </summary>
    [Column(IsPrimaryKey=true)]
    public DateTime LastEditDate { get; set; }

    /// <summary>
    /// Guid of last editor
    /// </summary>
    [Column]
    public Guid LastEditorGuid { get; set; }

    /// <summary>
    /// Summary of last changes
    /// </summary>
    [Column]
    public string LastEditNote { get; set; }

    /// <summary>
    /// Current editor. Null if checked in
    /// </summary>
    [Column(CanBeNull=true)]
    public Guid CheckedOutByGuid { get; set; }

我希望能够选择一个TestModule实体,进行一些修改,并将其作为新实体插入。我们的目标是拥有一段变化的历史。

但是,我无法插入更改后的对象。我得到一个错误信息‘无法添加已经存在的实体’。在插入对象之前,我将LastEdited属性设置为一个新值(现在),因为该属性是一个主键,所以它应该定义一个新的实体。情况似乎并非如此。

有人能帮我理解这里发生了什么吗?究竟是什么定义了一个实体?主键?对象标识?还有别的吗?

EN

回答 2

Stack Overflow用户

发布于 2013-04-16 21:58:13

在我看来,实体首先由对象本身标识,而不是由对象的主键属性标识。我发现克隆对象是前进的方向。如果主键属性保持不变,则尝试插入克隆对象会被视为错误,这是意料之中的。调用Context.SubmitChanges()方法时,会在数据库中更新已修改的对象。我想,这一切都很合乎逻辑--一旦你掌握了诀窍..

票数 0
EN

Stack Overflow用户

发布于 2013-04-19 16:05:45

您可以尝试设置

代码语言:javascript
复制
 db.ObjectTrackingEnabled = false 

在您选择实体时的数据上下文上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16014648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档