4

我正在开发一个企业应用程序,该应用程序将由一个丰富的 WPF 客户端组成,该客户端与一堆 Web 服务进行对话以检索数据。这些数据是使用 Code First EF 4.2 创建的 POCO。

我现在面临一个概念问题,我一直试图解决这个问题,但找不到一个好的解决方案。

1:n 关联

所以数据模型看起来像这样:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Children { get; set; }
}

服务器端我有一个接口,负责将新创建的 dto(包括子集合中的新项目)从客户端附加到数据上下文并保存。这当然只有在客户端创建这些实体然后发送以添加时才有效。该服务添加新实体并返回更新的实体(主要是 Id 属性)。

[ServiceContract]
public interface IMyPersonCaretaker
{
    [OperationContract]
    Person CreatePerson(Person entity)
}

但是,当我检索已经存在的实体时,我无法编辑任何关联(添加或删除实体 - 因为它们的大小是固定的)。所以现在我需要扩展接口以允许这样做:

[ServiceContract]
public interface IMyPersonCaretaker
{
    [OperationContract]
    Person CreatePerson(Person entity)

    [OperationContract]
    Person AddChild(Person parent, Person child)
}

对我来说,这似乎是一种笨拙的方法,而且界面变得越来越大,而且速度很快。这是与 POCO 合作的复杂方法吗?你怎么做呢?

通过手动映射的 n:m 关联

数据模型的不同部分如下所示:

public class ClassA
{
    public int Id { get; set; }
    public virtual ICollection<AtoBMapping> Mappings { get; set; }
}

public class ClassB
{
    public int Id { get; set; }
    public virtual ICollection<AtoBMapping> Mappings { get; set; }
}

public class AtoBMapping
{
    public int Id { get; set; }
    public virtual ClassA A { get; set; }
    public virtual ClassB B { get; set; }
}

每当我尝试在客户端创建 ClassA 和 ClassB 的实例并通过绑定将其相互添加时,当我尝试将其添加到上下文中的 Set 时出现错误。该错误表示不允许从 Mappings 属性中删除项目,我真的不明白这是从哪里来的。

第二部分在描述方面可能有点过于抽象,如果有人需要更多信息,我非常愿意添加它!

PS:请不要建议 Selftracking Entities,我知道它们,但我真的会对纯粹基于 EF 4.2 POCO 的解决方案感兴趣。

PPS:代码是手写到这个窗口中的,而不是实际使用的代码,所以可能会丢失一些东西,但这不是我问题的重点,所以我希望它就足够了。

4

1 回答 1

1

我有一个类似的解决方案,我们需要一大堆 CRUD 类型的操作,但是我们的数据模型不会离开服务器,我们使用 automapper 将对象映射到单独的 DTO,这些 DTO 通常是 WCF DatContract 类并且没有像域模型。

最初这可能看起来像一个非常冗长的方法,但 IMO 它最终得到了回报,因为您对接口有很多明确的控制,并且在很多情况下,您并不需要将整个域模型(及其所有关系)转移到客户端,一个客户端一般只能显示这么多数据。

另一种选择可能是 WCF DataServices,它们将使用 RESTful 接口来传输您的数据。

[新选项]

我过去使用的另一个选项基本上只是一个采用字节数组的 CRUD 服务方法。使用 NetDataContractSerializer 对这些方法进行序列化/反序列化对象图。然后使用自定义客户端来回传输数据,创建对象并将它们附加到 DataContext 以执行操作.... 像这样

于 2011-11-22T15:58:43.587 回答