C# 如何在基于WCF的场景中管理EF 4.2关联

C# 如何在基于WCF的场景中管理EF 4.2关联,c#,wcf,ef4-code-only,C#,Wcf,Ef4 Code Only,我正在开发一个企业应用程序,它将由一个富WPF客户机组成,该客户机与一组Web服务对话以检索数据。这些数据是POCO,使用代码优先EF 4.2创建 我现在正面临一个概念上的问题,我一直在努力解决这个问题,但找不到一个好的解决办法 1:n关联 因此,数据模型如下所示: public class Person { public int Id { get; set; } public string Name { get; set; } public virtual IColle

我正在开发一个企业应用程序,它将由一个富WPF客户机组成,该客户机与一组Web服务对话以检索数据。这些数据是POCO,使用代码优先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; }
}
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; }
}
但是,当我检索现有实体时,我无法编辑任何关联(添加或删除实体-因为它们的大小是固定的)。因此,现在我需要扩展接口以允许:

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

    [OperationContract]
    Person AddChild(Person parent, Person child)
}
在我看来,这似乎是一种笨拙的方法,而且界面越来越大,速度也越来越快。这是使用POCO的复杂方法吗?你是怎么做到的

n:m通过手动映射关联

数据模型的另一部分如下所示:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Children { get; set; }
}
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
{
公共int Id{get;set;}
公共虚拟ICollection映射{get;set;}
}
公共B类
{
公共int Id{get;set;}
公共虚拟ICollection映射{get;set;}
}
公共类原子映射
{
公共int Id{get;set;}
公共虚拟类A{get;set;}
公共虚拟类B{get;set;}
}
每当我试图在客户端创建ClassA和ClassB的实例并通过绑定将其添加到彼此中时,当我试图将其添加到上下文中的集合时,就会出现一个错误。错误表明不允许从Mappings属性中删除项,我真的不明白这是从哪里来的

第二部分可能有点过于抽象,如果有人需要进一步的信息,我非常愿意添加它

PS:请不要建议自我跟踪实体,我知道它们,但我真的很感兴趣的解决方案,这是纯粹基于EF 4.2 POCO


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

我有一个类似的解决方案,我们需要大量CRUD类型的操作,但我们的数据模型没有离开服务器,我们使用automapper将对象映射到单独的DTO,这些DTO通常是WCF DatContract类,没有域模型那么多的关系

起初,这似乎是一个非常冗长的方法,但在我看来,它最终会得到回报,因为您对接口有很多明确的控制,并且在许多情况下,您实际上不需要将整个域模型(及其所有关系)传输给客户机,客户机通常只能显示这么多数据

另一个选项可能是WCF数据服务,它们将使用RESTful接口来传输数据

[新选项]

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

的东西,您是否可以公开更高级别的抽象作为您的服务接口?我通常喜欢将所有数据模型代码保存在服务中,并在服务上公开某种业务逻辑操作。因此,我可能没有像CreatePerson、AddChild这样的方法,而是有一些更接近于在软件中执行的操作的方法(在不知道您最终希望服务做什么的情况下,我很难解释,对不起!)@user1039947最终的目标功能是管理像这样的数据——简单的类,只有几个1:n assocs和更少的n:m assocs。大部分时间数据都是添加的,而不是编辑的。谢谢你的建议,讽刺的是,由于冗长,我们刚刚从使用DTO切换到了POCO。我同意,如果你有那种复杂的数据模型,这是一种更好的方法,但我们的不是,它真的很简单。尽管如此,即使使用DTO,您也需要以某种方式在某处管理父-子关联。