我想为插入和更新某些EF对象的事件添加一些逻辑。 我有一个带有category对象的MVC应用程序,它有一个属性,它是name属性的一个slugified版本。
public class Category
{
public string Name { get; set; }
public string UrlName{ get; set; }
}
我想仅在插入和更新事件上设置UrlName属性,因为我的slugify逻辑非常精细。
我知道我可以在上下文本身的SaveChanges()函数中添加一些逻辑,但我更愿意让代码更靠近实体本身。
有没有办法先使用EF代码完成这样的事情?
答案 0 :(得分:25)
您可以使用在插入和更新之前调用的方法来设置基类
public abstract class Entity
{
public virtual void OnBeforeInsert(){}
public virtual void OnBeforeUpdate(){}
}
public class Category : Entity
{
public string Name { get; set; }
public string UrlName{ get; set; }
public override void OnBeforeInsert()
{
//ur logic
}
}
然后在DbContext
public override int SaveChanges()
{
var changedEntities = ChangeTracker.Entries();
foreach (var changedEntity in changedEntities)
{
if (changedEntity.Entity is Entity)
{
var entity = (Entity)changedEntity.Entity;
switch (changedEntity.State)
{
case EntityState.Added:
entity.OnBeforeInsert();
break;
case EntityState.Modified:
entity.OnBeforeUpdate();
break;
}
}
}
return base.SaveChanges();
}
答案 1 :(得分:1)
没有这样的扩展点,因为您的实体是POCO - 它不知道它的持久性。必须在知道持久性的数据访问层中触发这种逻辑。 DbContext API仅提供覆盖SaveChanges
。
您可以在实体上公开自定义事件或方法,并在SaveChanges
处理过程中调用它们。