1

好吧,在这篇文章中,我得出的结论是,在每次调用模式下使用服务更好,因为它更有效。这使我拥有短暂的数据上下文,即我调用的方法的生命周期。

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

但是,例如,我该如何处理一项操作、修改和更新?

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

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

但是,当书籍列表中有新书籍以及存在但其信息被修改的书籍时会发生什么?

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

谢谢。戴姆洛克。

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

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

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

谢谢。

4

2 回答 2

1

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

  • 使用标志(IsNew、IsDirty、IsDeleted)管理 POCO 实体的状态;
  • 当您将 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);
        }
    }
}

其中Authors是POCO 类型的实体ObjectSet,是对象上下文,是循环遍历所有子状态管理器以更新其状态的方法。mAuthorctxSetRelationsState

更改状态后,在我的存储库对象中调用ctx.SaveChanges(). 这是 AuthorRepository 类中的 Update 方法:

public Author Update(Author m, bool commit)
{
    _AuthorStateManager.ChangeState(m, _ctx);
    if (commit)
    {
        _ctx.SaveChanges();
    }
    return m;
}

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

这似乎有点令人费解,但如果您为这些类生成代码,它会变得更容易。

于 2012-05-04T10:42:51.673 回答
1

如果您想在单个服务调用中执行多个操作,那么要执行的操作需要从方法调用转变为对象。例如,您可能有一个 InsertCustomerAction 类,该类有一个与之关联的 Customer 实例。所有这些操作都将具有一个基类 (Action),并且您的 WCF 方法将采用 Action 实例的集合。

于 2012-05-04T14:01:38.667 回答