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