【问题标题】:Entity Framework - CF/FA - Define filtered navigation properties in POCOs实体框架 - CF/FA - 在 POCO 中定义过滤的导航属性
【发布时间】:2013-12-10 04:54:08
【问题描述】:

我正在使用带有代码优先方法和流畅 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 为空。我希望 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 对象创建的表的导航属性信息。是否可以通过 fluent API 告诉 Entity 框架它应该如何处理这些导航属性?

我现在所做的是我告诉 EF 忽略导航属性并且我已经覆盖了 get 方法,但这不是我正在寻找的完美解决方案,因为我希望 POCO 在任何情况下都保持不变方式。

如果有人能告诉我这是否可能以及此类构造的首选解决方案/常见做法是什么,那就太好了。

感谢您的帮助!

【问题讨论】:

    标签: c# entity-framework entity-relationship fluent navigation-properties


    【解决方案1】:

    您可以使用 Fluent 或 Data Annotations 或仅使用简单的命名约定来定义表之间的关系,但您不能使用任何一种来确定哪些数据进入表中。您可以设置必填字段、主键、外键。关系可以是 1:1 或 1:0,1 或 1:many 或 many:many 等。但没有办法告诉它特定的 ICollection 包含所有匹配项。这将是您的业务逻辑的责任,以确保在将项目添加到表 C 时,它也会添加到 A 的 ICollection。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 2018-04-27
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多