[英]How can I add default values to a property when saving using Code First EF4.1?
我首先創建如下模型:
public abstract class EditableBase
{
public DateTime CreatedOn { get; set; }
public DateTime ModifiedOn { get; set; }
public int CreatedBy { get; set; }
public int ModifiedBy { get; set; }
}
public class Project : EditableBase
{
public int ProjectId { get; set; }
public string ProjectName { get; set; }
}
當應用啟動時,我使用以下行:
Database.SetInitializer<ModelContext>(
new DropCreateDatabaseIfModelChanges<ModelContext>());
創建了一個名為Projects的表,其中包含上述所有屬性作為列。這正是我想要的。
但是,現在我在DbContext上發出SaveChanges()時需要填充一些默認值。 保存時,我需要使用適當的值更新ModifiedOn和ModifiedBy屬性。
通常,我至少會在數據庫端(觸發器或存儲過程)執行DateTime值,但這顯然不是一個選擇,因為只要類發生更改,數據庫都會被刪除。 而且由於我是先編寫代碼的,所以我沒有模型設計師可以調整其屬性。
我想做的是在EditableBase類中添加一個方法,該方法在執行SaveChanges()時被調用,從而將所有邏輯都放在一個地方。 是否有可能做到這一點? 實現目標的最佳方法是什么?
在派生的DbContext
覆蓋SaveChanges
:
public override int SaveChanges()
{
foreach(var entry in ChangeTracker.Entries<EditableBase>())
{
var entity = entry.Entity;
if (entry.State == EntityState.Added)
{
entity.CreatedOn = ...;
entity.CreatedBy = ...;
}
else if (entry.State == EntityState.Modified)
{
entity.ModifiedOn = ...;
entity.ModifiedBy = ...;
}
}
return base.SaveChanges();
}
我不確定通用Entries
是否可以直接與您的基本類型一起使用,因為它實際上並未映射為基本實體。 還有非通用版本,因此您可以將其重寫為更復雜的linq查詢,或者循環測試每個條目的實體類型。
好吧,您可以完全控制實體的代碼。 我想您可能想要實現IPropertyChanged之類的模式來更新您的屬性。
有沒有考慮在兩種選擇這個職位 ,你在二傳手(或構造函數)做些什么?
默認屬性解決方案似乎是一個很好的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.