实体框架:在SaveChanges期间在代码中设置实体ID时,抱怨null id

Nic*_*els 1 entity-framework-4

让我们假设以下代码处理DataContext的SaveChanges事件

void Context_SavingChanges(object sender, EventArgs e)
    {

        IEnumerable<ObjectStateEntry> objectStateEntries =
            from ose in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted)
            where ose.Entity != null
            select ose;

        foreach (ObjectStateEntry entry in objectStateEntries)
        {
            foreach (var field in entry.CurrentValues.DataRecordInfo.FieldMetadata)
            {
                var guid = Guid.NewGuid();
                AuditEntry audit = AuditEntry.CreateAuditEntry(
                    id: guid,
                    entitySet: entry.EntitySet.Name,
                    typeName: entry.Entity.GetType().Name,
                    entityId: (entry.CurrentValues["Id"] as string) ?? ((entry.State == EntityState.Added) ? "New" : null),
                    oldValue: (entry.State != EntityState.Added) ? entry.OriginalValues[field.FieldType.Name].ToString() : "New",
                    newValue: (entry.State != EntityState.Deleted) ? entry.CurrentValues[field.FieldType.Name].ToString() : "Deleted",
                    modifier: Environment.UserDomainName + "\\" + Environment.UserName,
                    dbAction: Enum.GetName(typeof(EntityState), entry.State),
                    field: field.FieldType.Name,
                    dateStamp: DateTime.Now
                );


                this.AuditEntries.AddObject(audit);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我创建一个新实体并尝试保存它的更改时,我收到此错误:

无法将值NULL插入列'Id',表'TimeEF.dbo.AuditEntries'; 列不允许空值.INSERT失败.该语句已终止.

当你看到我设置了Id,有什么想法吗?错误?

use*_*238 8

您是否在EDMX文件中检查了对象的id列?如果其StoreGeneratedPattern属性标记为"computed"或"identity",则EF不会将C#值传递给其SQL语句.将StoreGeneratedPattern属性设置为"None",Entity Framework写入的SQL将包含您的C#创建的id值.

<EntityType Name="AuditEntry">
    //...
    <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="None" />
    //...
</EntityType>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/dd296755(v=vs.90).aspx.