实体框架SaveChanges在EntityObject的扩展部分内

时间:2014-01-03 21:08:56

标签: c# entity-framework

我正在扩展自动生成的部分以更改数据库中某行的状态标志。现在我已经开始工作,但我需要从局部之外调用db.SaveChanges()。有没有办法让我可以从局部内部获取当前实体上下文,以便立即保存更改?

public partial interface IMyEntityStatusChange
{
    void ChangeStatus(MyEntityStatusCode code);
}

public partial class MyEntity : IMyEntityStatusChange
{
    public void ChangeStatus(MyEntityStatusCode code)
    {
        StatusCode = (int)code;
        //Now I want to Save it to the db
    }
} 

现在我必须做这样的事情:

using(var db = new EFEntities())
{
    db.MyEntities.FirstorDefault().ChangeStatus(MyEntityStatusCode.Failed);
    db.SaveChanges();
}

谢谢!

1 个答案:

答案 0 :(得分:2)

它会破坏实体框架的持久性无知范式,但除此之外,如果你坚持,可能会有这样做。

首先,您需要扩展您的界面:

internal interface IMyEntityStatusChange
{
    DbContext Context { get; set; }
    void ChangeStatus(MyEntityStatusCode code);
}

然后在你的上下文的构造函数中(假设它是DbContext):

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
                                            Context_ObjectMaterialized;

方法:

void Context_ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
{
    var contextAwareEntity = e.Entity as IMyEntityStatusChange;
    if (contextAwareEntity != null)
    {
        contextAwareEntity.Context = this;
    }
}

(需要using System.Data.Entity.Core.Objects;

警告很多:

  • 可以随时处理上下文,违反了ChangeStatus方法。
  • 这意味着您需要检查ChangeStatus是否成功。或者当它没有时抛出异常?不管怎样都不好。
  • 只要其中一个IMyEntityStatusChange仍然存在,就不会对已处置的上下文进行垃圾回收。
  • 如果其他属性发生了变化,这些属性也会被保留,也许在您真正想要它之前。