2011-11-22 31 views
4

我正在研究一个企业应用程序,该应用程序将包含一个丰富的WPF客户端,该客户端会与一堆webservices进行对话以检索数据。这些数据是使用Code First EF 4.2创建的POCO。如何在基于WCF的场景中管理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集团我有这需要附加新创建的DTOS(包括儿童收集新项目)的护理接口从客户端到数据上下文并保存。这当然只适用于在客户端创建这些实体然后发送添加的实体。该服务添加新实体并返回更新的实体(主要是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:通过手动映射中号协会

数据模型的不同部分是这样的:

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实体,我知道他们,但我真的会对纯粹基于EF 4.2 POCOs的解决方案感兴趣。

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

+1

您能否将更高级别的抽象作为您的服务接口公开?我通常喜欢将我的所有数据模型代码保存在服务中,并在服务上公开某种业务逻辑操作。因此,我可能不会使用像CreatePerson,AddChild这样的方法,而是使用更类似于软件中正在执行的操作的东西(难以在不知道您最终希望服务执行什么的情况下进行解释,对不起!)。 – kmp

+0

@ user1039947最终的目标功能是管理类似这样的数据 - 简单的类有几个1:n的关联和更少的n:m关联。大部分时间数据正在被添加而不是被编辑。 – UrbanEsc

回答

1

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

最初,这可能看起来像一个非常详细的评论,但它最终得到回报,因为你有很多明确的控制你的接口,在很多情况下,你并不需要转移整个域模型关系)给客户,客户通常只能显示这么多的数据。

另一个选项可能是WCF DataServices,它们会使用RESTful接口来传输数据。

[新选项] i的过去基本上只是一个CRUD服务方法,需要一个字节数组使用

一个其它选项。 使用NetDataContractSerializer将对象图序列化或从这些方法中反序列化。然后使用自定义客户端来回传输数据,创建对象并将它们附加到DataContext以执行操作.... 类似this

+0

感谢您的建议,具有讽刺意味的是,由于冗长,我们刚刚从使用DTO切换到POCO。如果你有这种复杂的数据模型,我会同意这是一个更好的方法,但我们不是,它非常简单。尽管如此,即使是DTO,您也需要管理Parent Child在某处的联系。 – UrbanEsc

+0

请参阅更新的新选项 –