使用Entity-Framework代码优先将实体持久化到数据库时,如何执行代码?

时间:2011-05-15 12:36:28

标签: entity-framework ef-code-first entity-framework-4.1

使用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);
    }
}

理想情况下,我希望所有这些代码都存储在Model中,但由于我没有EF拥有的基类/部分类,我怀疑是否可能,我必须注册/连接它其他地方。问题是 - 是否可能,如果是,我该如何连线?

1 个答案:

答案 0 :(得分:1)

唯一的方法是覆盖上下文中的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中使用该接口。