WCF:如何修改具有不同类型操作的寄存器(更新,添加,删除...)

时间:2012-05-04 08:58:36

标签: wcf

好吧,in this post,我得出的结论是,在每次通话模式下使用服务会更好,因为它更有效率。这使我的数据上下文寿命很短,我称之为方法的生命周期。

在这个例子中,我看到如何修改元素列表的数据,只需要设置要修改的实体的状态。

但是,我怎么能用一个操作,修改和更新,例如?

一个案例可以是这个。我有书籍和作者,客户端应用程序有两个数据网格视图,一个用于作者,另一个用于书籍。用户可以在第一个数据网格中添加作者并修改其信息,并对第二个数据网格中的书籍执行相同的操作。也可以为他们的作者分配书籍。

我有POCO课程,所以我有一个作者类,其属性是书籍列表。好吧,我可以在这个列表中添加书籍,然后当我调用服务方法updateAuthors时,我只需要使用作者类作为参数,EF知道如何处理书籍。也不需要通过这本书。

但是,如果在书籍清单中有新书和书籍存在但其信息被修改会发生什么呢?

在我在开头提到的帖子的例子中,它说明了在修改所有实体时如何做,但如果我想添加新的寄存器,我需要设置要添加的状态。所以,如果有混合实体,我该怎么办呢?它是否存在任何模式或某种方式来做到这一点?我必须设置所有书籍的状态?我可以知道书籍的状态,因为我使用自动数字作为ID,所以如果ID为0则是新的寄存器,在其他情况下是修改。

感谢。 Daimroc。

编辑:也许我的问题不是很清楚。我想知道的是如何一次保存许多实体的更改。例如,我有作者,书籍和顾问。我添加,修改和删除其中许多信息。在我的WCF客户端中,我有保存作者更改的方法,保存书籍更改的其他方法以及保存客户更改的其他方法。

我的服务是如何通过每次通话,我需要进行三次通话,每种类型的实体一次,这是独立的。但是,如果我直接使用实体框架,我可以对许多类型的实体进行许多更改,我只需要调用一次savechanges,它就可以完成所有工作。我如何对WCF和POCO实体做同样的事情?

我正在阅读有关自我跟踪实体的信息,购买我有同样的问题,我可以使用Applychanges(实体),但如果我没有错,它只会将更改应用于一个实体。如果我对许多实体进行了更改,是否需要调用N次?

感谢。

2 个答案:

答案 0 :(得分:1)

不确定这是否会回答您的问题,但这是我的建议:

  • 使用标志管理POCO实体的状态(IsNew,IsDirty,IsDeleted);
  • 当您将POCO实体传递给对象上下文时,请使用ObjectStateManager更改附加的实体状态;
  • 递归循环遍历子实体列表并应用相同的方法。

编辑: 以下代码是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);
        }
    }
}

其中AuthorsObjectSetm是类型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;
}

_BookStateManagerBookStateManager类型的私有成员,它以自己的ChangeState()方法修改Book状态。 我建议你让State Manager类实现一个名为IStateManager的接口,它具有ChangeState()方法。

看起来有点复杂,但如果为这些类生成代码会变得更容易。

答案 1 :(得分:1)

如果要在单个服务调用中执行多个操作,则需要采取的操作从方法调用转移到对象。例如,您可能有一个InsertCustomerAction类,其中有一个Customer实例。所有这些操作都有一个基类(Action),您的WCF方法将接收一组Action实例。