我正在使用Entity Framework和Code第一种方法以及流畅的API。鉴于以下POCO课程......
class A {
public A {
this.Cs = new HashSet<C>();
this.Bs = new HashSet<B>();
}
public long Id { get; set; }
public virtual ICollection<C> Cs { get; set; }
public virtual ICollection<B> Bs { get; set; }
}
public class B {
public B {
this.Cs = new HashSet<C>();
}
public long Id { get; set; }
public virtual A A { get; set; }
public virtual ICollection<C> Cs { get; set }
}
public class C {
public long Id { get; set; }
public virtual A A { get; set; }
public virtual B B { get; set; }
}
...我想用Fluent API定义以下关系,但我不知道这是怎么回事。
我希望类A的导航属性Cs包含C类的所有对象,其中c.A设置为此A的实例,而c.B为null。我希望A类的Bs包含B的所有对象,其中bA被设置为此A的实例。我希望B类的导航属性Cs包含C类的所有对象,其中Ca设置为Ba并且Cb设置为此B的实例。
一个例子应该更好地说明这一点:
+------+------+-----+
| C.Id | C.A | C.B |
+------+------+-----+
| 1 | 1 | |
| 2 | 1 | |
| 3 | 1 | 1 |
| 4 | 1 | 2 |
+------+------+-----+
然后A.Cs包含{1,2}和A.Bs包含{1,2},其中B [id = 1] .Cs包含{3}且B [id = 2] .Cs包含{4}。
因此,我只需要为C对象创建的表的导航属性的信息。是否可以通过流畅的API告诉实体框架它应该如何使用这些导航属性?
我现在所做的是我告诉EF忽略导航属性并且我已经覆盖了get方法,但这不是我正在寻找的完美解决方案,因为我希望POCO保持不受影响方式。
如果有人能告诉我这是否可能,以及这些结构的首选解决方案/常规做法是什么,那就太好了。
感谢您的帮助!
答案 0 :(得分:0)
您可以使用Fluent或数据注释,也可以使用简单的命名约定来定义表之间的关系,但不能使用任何一种来确定表中的数据。您可以设置必填字段,主键,外键。关系可以是1:1或1:0,1或1:很多或很多:很多,等等。但是没有办法告诉它特定的ICollection包含所有匹配的项目。这将是您的业务逻辑的责任,以确保当一个项目添加到表C时它也被添加到A的ICollection。