好吧,in this post,我得出的结论是,在每次通话模式下使用服务会更好,因为它更有效率。这使我的数据上下文寿命很短,我称之为方法的生命周期。
在这个例子中,我看到如何修改元素列表的数据,只需要设置要修改的实体的状态。
但是,我怎么能用一个操作,修改和更新,例如?
一个案例可以是这个。我有书籍和作者,客户端应用程序有两个数据网格视图,一个用于作者,另一个用于书籍。用户可以在第一个数据网格中添加作者并修改其信息,并对第二个数据网格中的书籍执行相同的操作。也可以为他们的作者分配书籍。
我有POCO课程,所以我有一个作者类,其属性是书籍列表。好吧,我可以在这个列表中添加书籍,然后当我调用服务方法updateAuthors时,我只需要使用作者类作为参数,EF知道如何处理书籍。也不需要通过这本书。
但是,如果在书籍清单中有新书和书籍存在但其信息被修改会发生什么呢?
在我在开头提到的帖子的例子中,它说明了在修改所有实体时如何做,但如果我想添加新的寄存器,我需要设置要添加的状态。所以,如果有混合实体,我该怎么办呢?它是否存在任何模式或某种方式来做到这一点?我必须设置所有书籍的状态?我可以知道书籍的状态,因为我使用自动数字作为ID,所以如果ID为0则是新的寄存器,在其他情况下是修改。
感谢。 Daimroc。
编辑:也许我的问题不是很清楚。我想知道的是如何一次保存许多实体的更改。例如,我有作者,书籍和顾问。我添加,修改和删除其中许多信息。在我的WCF客户端中,我有保存作者更改的方法,保存书籍更改的其他方法以及保存客户更改的其他方法。我的服务是如何通过每次通话,我需要进行三次通话,每种类型的实体一次,这是独立的。但是,如果我直接使用实体框架,我可以对许多类型的实体进行许多更改,我只需要调用一次savechanges,它就可以完成所有工作。我如何对WCF和POCO实体做同样的事情?
我正在阅读有关自我跟踪实体的信息,购买我有同样的问题,我可以使用Applychanges(实体),但如果我没有错,它只会将更改应用于一个实体。如果我对许多实体进行了更改,是否需要调用N次?
感谢。
答案 0 :(得分:1)
不确定这是否会回答您的问题,但这是我的建议:
编辑: 以下代码是AuthorStateManager类:
public partial class AuthorStateManager : IStateManager<Author, Context>
{
private IStateManager<Book, Context> _BookStateManager = new BookStateManager();
public void ChangeState(Author m, Context ctx)
{
if (m == null) return;
ctx.Authors.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(Author m, Context ctx)
{
foreach (Book varBook in m.Books)
{
_BookStateManager.ChangeState(varBook, ctx);
}
}
}
其中Authors
是ObjectSet
,m
是类型Author
的POCO实体,ctx
是对象上下文,SetRelationsState
是循环所有子状态管理器以更新其状态的方法。
更改状态后,在我的存储库对象中,我调用ctx.SaveChanges()
。这是AuthorRepository类中的Update方法:
public Author Update(Author m, bool commit)
{
_AuthorStateManager.ChangeState(m, _ctx);
if (commit)
{
_ctx.SaveChanges();
}
return m;
}
_BookStateManager
是BookStateManager
类型的私有成员,它以自己的ChangeState()
方法修改Book状态。
我建议你让State Manager类实现一个名为IStateManager
的接口,它具有ChangeState()
方法。
看起来有点复杂,但如果为这些类生成代码会变得更容易。
答案 1 :(得分:1)
如果要在单个服务调用中执行多个操作,则需要采取的操作从方法调用转移到对象。例如,您可能有一个InsertCustomerAction类,其中有一个Customer实例。所有这些操作都有一个基类(Action),您的WCF方法将接收一组Action实例。