我将实体框架与“代码优先”方法和流畅的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.C包含{1,2},A.B包含{1,2},其中B [id = 1] .Cs包含{3},B [id = 2] .Cs包含{4}。
因此,我只需要有关为C对象创建的表的导航属性的信息。是否可以通过流利的API告诉Entity框架如何与这些导航属性一起使用?
我现在所做的是,我告诉EF忽略导航属性,并且覆盖了get方法,但这并不是我正在寻找的完美解决方案,因为我希望POCO保持任何状态都不会改变。
如果有人能告诉我这是否可行,以及这种构造的首选解决方案/常见做法是什么,那将是很好的。
谢谢你的帮助!
最佳答案
您可以使用Fluent或Data Annotations或仅使用简单的命名约定来定义表之间的关系,但是不能使用哪种方法来确定将哪些数据放入表中。您可以设置必填字段,主键,外键。关系可以是1:1或1:0,1或1:many或many:many等。但是无法告诉它特定的ICollection包含所有匹配项。这将是您的业务逻辑的职责,以确保将项目添加到表C时,它也添加到A的ICollection中。
关于c# - Entity Framework -CF/FA-在POCO中定义过滤的导航属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20193498/