2011-01-19 148 views
1

時在代碼中設置空ID的抱怨讓我們假設下面的代碼操作的一個DataContext實體框架:當實體ID的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); 
      } 
     } 
    } 

調用SaveChanges事件當我創建一個新的實體,並試圖保存它的變化我得到這個錯誤:

Cannot insert the value NULL into column 'Id', table 'TimeEF.dbo.AuditEntries'; column does not allow nulls. INSERT fails. The statement has been terminated.

當你可以看到我已經設置了ID,任何想法?錯誤?

+1

您是否*正面*有問題的記錄來自此代碼?跟蹤SQL。 – 2011-01-19 20:49:29

+0

斷點?查看拋出異常的哪一行 - 檢查ID。 – RPM1984 2011-01-20 00:07:16

回答

8

你在EDMX文件中檢查過你的對象的id列嗎?如果其StoreGeneratedPattern屬性標記爲「計算」或「標識」,則EF不會將C#值傳遞給其SQL語句。將StoreGeneratedPattern屬性設置爲「無」,實體框架寫入的SQL將包含您的C#創建的id值。

<EntityType Name="AuditEntry"> 
    //... 
    <Property Name="id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
    //... 
</EntityType> 

欲瞭解更多信息,請參閱http://msdn.microsoft.com/en-us/library/dd296755(v=vs.90).aspx