2011-07-03 165 views
20

我首先使用EF代碼和數據庫第一種方法。 「與Database.SetInitializer(null);」EF Code First Readonly列

我的表格有兩列createddate和amendddate。它們由SQL Server使用觸發器進行管理。這個想法是,當數據輸入發生時,這些列通過觸發器獲取數據。

現在我想要做的就是讓這個只讀從EF代碼的第一個角度來看。即我希望能夠從我的應用程序中看到創建的日期和日期,但我不想修改這些數據。

我已經嘗試在setter上使用私有修飾符,但沒有運氣。當我嘗試向表中添加新數據時,它試圖將DateTime.Max日期輸入到從SQL Server引發錯誤的數據庫中。

有什麼想法?

回答

32

因爲EF本身需要時,它加載你的實體來設置你的屬性和代碼第一次也只能做到這一點時設置屬性的公共setter方法(對比EDMX其中私人setter方法可能(1)(2))不能使用私有修飾符。

您需要做的是將您的CreatedDate標記爲DatabaseGeneratedOption.Identity,將AmendDate標記爲DatabaseGeneratedOption.Computed。這將允許EF從數據庫正確加載數據,在插入或更新後重新加載數據,以便實體在應用程序中保持最新狀態,同時它不會允許您更改應用程序中的值,因爲設置的值應用程序將永遠不會傳遞到數據庫。從面向對象的角度來看,它不是一個很好的解決方案,但從功能角度來看,它正是你想要的。

您可以用數據說明做:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public DateTime CreatedDate { get; set; } 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public DateTime AmendDate { get; set; } 

或者在你導出的上下文中OnModelCreating覆蓋流利的API:

modelBuilder.Entity<YourEntity>() 
      .Property(e => e.CreatedDate) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
modelBuilder.Entity<YourEntity>() 
      .Property(e => e.AmendDate) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
+0

感謝您的快速回復。 DatabaseGeneratedOption.Identity和DatabaseGeneratedOption.Computed有什麼區別?我似乎無法在網上找到關於此的更多細節。 thx編輯:不回答,我得到了我的答案:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.databasegeneratedoption(v=vs.103).aspx。我會讓你知道如何去感謝 – daehaai

+0

這已經解決了這個問題。非常感謝 – daehaai

+0

當我把[DatebaseGenerated(DatabaseGeneratedOption.Identity)]屬性爲我得到的CreatedDate屬性,更新數據庫:標識列'CreatedDate'必須是數據類型int,bigint, smallint,tinyint或小數或數字比例爲0,並且限制爲 不可爲空。 – koraytaylan