0

我有下表

[TestModule]
ProductId uniqueidentifier primarykey
ModuleId uniqueidentifier primarykey
LastEdited timestamp primarykey
LastEditor uniqueidentifier
LastEditComment nvarchar(200)
CheckedOutTo uniqueidentifier
... other fields ...

该类定义如下:

    [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 属性设置为一个新值(现在),并且期望由于该属性是主键,它应该定义一个新实体。情况似乎并非如此。

任何人都可以帮助我了解这里发生了什么吗?实际上定义实体的是什么?主键?对象身份?还有什么?

4

2 回答 2

0

你可以尝试设置

 db.ObjectTrackingEnabled = false 

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

于 2013-04-19T08:05:44.840 回答
0

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

于 2013-04-16T13:58:13.220 回答