如何使用实体框架代码优先将实体持久保存到数据库时执行代码?
问题描述:
当使用EF/code-first将实体保存到数据库时,是否有一种很好的方法来执行代码?如何使用实体框架代码优先将实体持久保存到数据库时执行代码?
我在我的许多实体上有Url
属性。如果URL没有得到明确,我想计算一个作为对象持久化,例如:
public void OnModelSaving()
{
// If a URL has not been specified, generate one from the name.
if (this.Url == null)
{
this.Url = Helper.GenerateSafeUrl(this.Title);
}
}
理想情况下,我想这一切的代码存储模型里面,但因为我没有EF拥有的基础课程/部分课程,我怀疑如果可能的话,我必须在其他地方注册/连接它。问题是 - 是否有可能,如果是这样,我该如何连接它?
答
的唯一方法是重写你的背景下SaveChanges
方法,通过改变实体迭代并检查Url
public override int SaveChanges()
{
var entities = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added ||
e.State == EntityState.Modified)
.Select(e => e.Entity())
.OfType<YourEntityType();
foreach (var entity in entities)
{
entity.Url = ...;
}
return base.SaveChanges();
}
如果你有很多的实体类型提供Url
你可以尝试定义与Url
通过实现界面所有实体类型和OfType
都使用该接口。
我有一种感觉,我需要这样做,所以我已经想过接口。我认为,而不是有一个Url的东西的接口,我会添加一个通用的,只有一个OnModelSaving方法,因此它可以用于任何实体用于任何目的。耻辱它不是内置的。谢谢! – 2011-05-15 13:19:01