簡體   English   中英

使用Code First EF4.1保存時如何向屬性添加默認值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM