如何在基于WCF的场景中管理EF 4.2关联
本文关键字:管理 EF 关联 WCF | 更新日期: 2023-09-27 18:15:20
我正在开发一个企业应用程序,它将由一个富WPF客户端组成,该客户端与一堆web服务对话以检索数据。这些数据是poco,用Code First EF 4.2创建。
我现在正面临一个概念性的问题,我一直试图把我的头,但找不到一个好的解决方案。
1: n协会
所以数据模型看起来像这样:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> Children { get; set; }
}
Serverside i有一个接口,负责将新创建的dtos(包括Children Collection中的新项目)从客户端附加到数据上下文并保存它。当然,这只适用于在客户端创建实体,然后发送添加的情况。服务添加新的实体并返回更新后的实体(主要是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时,我会得到一个错误。错误说,它是不允许从映射属性中删除项目,我真的不明白这是从哪里来的。
第二部分可能有点过于抽象的描述明智,如果有人需要进一步的信息,我更愿意添加它!
PS:请不要建议自我跟踪实体,我知道他们,但我真的对一个纯粹基于EF 4.2 poco的解决方案很感兴趣。
PPS:代码是手工编写到这个窗口,而不是实际使用的代码,所以可能会有东西丢失,但这不是我的问题的重点,所以我希望它将足够。
我有一个类似的解决方案,我们需要一大堆CRUD类型的操作,但是我们的数据模型不离开服务器,我们使用automapper将对象映射到单独的dto,这些dto通常是WCF DatContract类,没有像域模型那样多的关系。
最初,这可能看起来像一个非常冗长的方法,但在我看来,它最终会得到回报,因为你对你的接口有很多明确的控制,并且在很多情况下,你真的不需要将整个领域模型(及其所有关系)转移到客户端,客户端通常只能显示这么多数据。
另一个选择可能是WCF数据服务,他们将使用RESTful接口来传输数据。
(新选项)是我过去使用的另一个选项,基本上只有一个接受字节数组的CRUD服务方法。使用NetDataContractSerializer来序列化/反序列化与这些方法之间的对象图。然后使用自定义客户端来回传输数据,创建对象并将它们附加到DataContext以执行操作....像这样