我正在开发一个企业应用程序,该应用程序将由一个丰富的 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:代码是手写到这个窗口中的,而不是实际使用的代码,所以可能会丢失一些东西,但这不是我问题的重点,所以我希望它就足够了。