不完全是你的方式,因爲我使用帶有狀態標誌的POCO,但它也可以應用於生成的實體。這是一種管理父實體和子實體狀態的遞歸方法。這是Parent
實體狀態管理器類:
public partial class ParentStateManager : IStateManager<Parent, MyObjContext>
{
private IStateManager<Child, MyObjContext> _ChildStateManager = new ChildStateManager();
public void ChangeState(Parent m, MyObjContext ctx)
{
if (m == null) return;
ctx.Parents.Attach(m);
if (m.IsDeleted)
{
ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Deleted);
}
else
{
if (m.IsNew)
{
ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Added);
}
else
{
if (m.IsDirty)
{
ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Modified);
}
}
}
SetRelationsState(m, ctx);
}
private void SetRelationsState(Parent m, MyObjContext ctx)
{
foreach (Child varChild in m.Children.Where(p => !p.IsDeleted))
{
_ChildStateManager.ChangeState(varChild, ctx);
}
while (m.Children.Where(p => p.IsDeleted).Any())
{
_ChildStateManager.ChangeState(m.Children.Where(p => p.IsDeleted).LastOrDefault(), ctx);
}
}
}
這是爲Child
實體狀態管理:
public partial class ChildStateManager : IStateManager<Child, MyObjContext>
{
public void ChangeState(Child m, MyObjContext ctx)
{
if (m == null) return;
ctx.Children.Attach(m);
if (m.IsDeleted)
{
ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Deleted);
}
else
{
if (m.IsNew)
{
ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Added);
}
else
{
if (m.IsDirty)
{
ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Modified);
}
}
}
SetRelationsState(m, ctx);
}
private void SetRelationsState(Child m, MyObjContext ctx)
{
}
}
IStateManager
是一個簡單的接口,它只有ChangeState
方法。 如果Child
實體具有GrandChild
集合,則ChildStateManager.SetRelationsState()
方法將調用GrandChildStateManager.ChangeState()
依此類推。這有點複雜,但它適用於我,我使用T4模板生成狀態管理器代碼。
當您嘗試做實體框架很酷的事情,你將有一個壞的時間(爲什麼切換到光速)。您需要查看EF的當前工作單元並確定如何實現嵌套。一些偉大的代碼在這裏http://code.google.com/p/ef4prs/source/browse/trunk/Infrastructure.Data.EntityFramework/UnitOfWork.cs – Jeremy
嗯,我想交易,但他們不恢復回滾對象環境的變化。所以,我仍然無法確定如何實現嵌套。 –