繁体   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