使用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( new DropCreateDatabaseIfModelChanges()); 

创建一个名为Projects的表,其中上面提到的所有属性都是列…这正是我想要的。

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

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

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

在派生的DbContext覆盖SaveChanges

 public override int SaveChanges() { foreach(var entry in ChangeTracker.Entries()) { 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是否会直接与您的基类型一起工作,因为它实际上并未映射为基本实体。 还有非generics版本,因此您可以将其重写为更复杂的linq查询或在循环中测试每个条目的实体类型。

好吧,您可以完全控制实体的代码。 我想你可能想要实现类似IPropertyChanged的模式来更新你的属性。

你是否考虑过这篇文章中的两个选项,你在setter(或构造函数)上做了什么?

默认属性解决方案似乎很好。