我有下面的表格
[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属性设置为一个新值(现在),因为该属性是一个主键,所以它应该定义一个新的实体。情况似乎并非如此。
有人能帮我理解这里发生了什么吗?究竟是什么定义了一个实体?主键?对象标识?还有别的吗?
发布于 2013-04-16 21:58:13
在我看来,实体首先由对象本身标识,而不是由对象的主键属性标识。我发现克隆对象是前进的方向。如果主键属性保持不变,则尝试插入克隆对象会被视为错误,这是意料之中的。调用Context.SubmitChanges()方法时,会在数据库中更新已修改的对象。我想,这一切都很合乎逻辑--一旦你掌握了诀窍..
https://stackoverflow.com/questions/16014648
复制相似问题