加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在基于WCF的方案中管理EF 4.2关联

发布时间:2020-12-15 21:26:18 所属栏目:百科 来源:网络整理
导读:我正在开发一个企业应用程序,它将包含一个丰富的 WPF客户端,该客户端与一堆web服务进行通信以检索数据.此数据是POCO,使用Code First EF 4.2创建. 我现在面临一个概念问题,我一直在试图解决这个问题,但无法找到一个好的解决方案. 1:n关联 所以datamodel看起
我正在开发一个企业应用程序,它将包含一个丰富的 WPF客户端,该客户端与一堆web服务进行通信以检索数据.此数据是POCO,使用Code First EF 4.2创建.

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

1:n关联

所以datamodel看起来像这样:

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

Serverside我有一个接口,负责将新创建的dtos(包括子集合中的新项目)从客户端附加到datacontext并保存.这当然只有在客户端创建这些实体然后发送才能添加时才有效.该服务添加新实体并重新回溯更新的实体(主要是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:代码是手工编写到这个窗口而不是实际使用的代码,所以可能会丢失一些东西,但这不是我的问题,所以我希望它就足够了.

解决方法

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

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

另一个选项可能是WCF DataServices,他们会使用RESTful接口来传输您的数据.

[新选项]

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读