【问题标题】:Entity Framework Filtered Navigation Properties实体框架过滤的导航属性
【发布时间】:2013-12-18 16:27:09
【问题描述】:

有没有办法先使用 EF6/代码在导航属性上设置过滤器?

我想实现类似于下面的内容,其中 Farm.Pigs 返回一个类型等于 pig 的动物集合(但没有先从数据库加载整个集合 - 并且不将它们存储在单独的表中)。这可能吗?

public class Farm {
    public int Id { get; set; }

    public virtual ICollection<Animal> Pigs { get; set; }

    public virtual ICollection<Animal> Cows { get; set; }
}

public class Animal {
    public int Id { get; set; }

    public int FarmId? { get; set; }

    public virtual Farm Farm { get; set; }

    public string Name { get; set; }
}

public enum AnimalType {
    Pig, Cow
}

更新

将更新移至新问题:Entity Framework One-Many TPH Mapping

【问题讨论】:

  • 你可以通过交互来做到这一点,猪和牛是动物......
  • 你应该去掉 AnimalType 列。 EF 根据“鉴别器”列实现正确的类型。然后尝试完全摆脱您的流利映射。我很确定您的模型遵循惯例,而 EF 正在为您解决问题。您的流利映射中可能存在创建额外列的错误,但是当约定为您执行此操作时,为什么还要担心呢?
  • 啊抱歉,我实际上已经删除了,我只是忘记从示例中删除它 - 不幸的是,这不是问题。

标签: c# entity-framework ef-code-first entity-framework-6


【解决方案1】:

你不能按照你要求的方式来做,这是实体框架的当前限制。

如果你创建了继承关系,你可以用不同的方式实现它,即

public class Animal {
    public int Id { get; set; }

    public AnimalType Type { get; set; }

    public string Name { get; set; }
}

public class Pig : Animal { ... }

public class Cow : Animal { ... }

然后您可以按照以下文章配置每个层次结构的表 (TPH):

http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

【讨论】:

  • 我不知道实体框架可以做到这一点,谢谢!
  • 我的例子可能不是最适合这个的,因为我确信猪不太可能变成牛但是......是否可以更改或映射鉴别器列在没有原始 SQL 查询的基本类型(即Animal)中?
  • 只是为了确认您希望能够将猪变成牛?我不确定,但我认为你不能使用带有 TPH 的 EF 来做到这一点
  • 不,但是Animal 是现有表,因此鉴别器列将为空!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2016-03-29
相关资源
最近更新 更多