使用Code First EF4.1进行保存时,如何向属性添加默认值?

Sai*_*udo 10 c# entity-framework entity-framework-4.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; }
}
Run Code Online (Sandbox Code Playgroud)

我在应用程序启动时使用此行:

Database.SetInitializer<ModelContext>(
            new DropCreateDatabaseIfModelChanges<ModelContext>());
Run Code Online (Sandbox Code Playgroud)

创建一个名为Projects的表,其中包含上面提到的所有属性...这正是我想要的.

但是,现在我需要在DbContext上发出SaveChanges()时填充一些默认值.当我保存时,我需要使用适当的值更新ModifiedOn和ModifiedBy属性.

通常我至少会在数据库端(触发器或存储过程)执行DateTime值,但这显然不是一个选项,因为数据库将在类更改时随时删除.因为我先做了代码,所以我没有一个可以调整属性的模型设计器.

我想要做的是在EditableBase类中添加一个方法,该方法在执行SaveChanges()时被调用,从而将所有逻辑都保存在一个地方.是否有可能做到这一点?实现目标的最佳方法是什么?

Lad*_*nka 8

覆盖SaveChanges你的派生DbContext:

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();
}
Run Code Online (Sandbox Code Playgroud)

我只是不确定泛型Entries是否会直接与您的基类型一起工作,因为它实际上并未映射为基本实体.还有非泛型版本,因此您可以将其重写为更复杂的linq查询或在循环中测试每个条目的实体类型.