我将实体框架与“代码优先”方法和流畅的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/

10-11 03:34