因爲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);
感謝您的快速回復。 DatabaseGeneratedOption.Identity和DatabaseGeneratedOption.Computed有什麼區別?我似乎無法在網上找到關於此的更多細節。 thx編輯:不回答,我得到了我的答案:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.databasegeneratedoption(v=vs.103).aspx。我會讓你知道如何去感謝 – daehaai
這已經解決了這個問題。非常感謝 – daehaai
當我把[DatebaseGenerated(DatabaseGeneratedOption.Identity)]屬性爲我得到的CreatedDate屬性,更新數據庫:標識列'CreatedDate'必須是數據類型int,bigint, smallint,tinyint或小數或數字比例爲0,並且限制爲 不可爲空。 – koraytaylan