我正在扩展自动生成的部分以更改数据库中某行的状态标志。现在我已经开始工作,但我需要从局部之外调用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();
}
谢谢!
答案 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
仍然存在,就不会对已处置的上下文进行垃圾回收。