【问题标题】:Entity Framework 6 One-To-Many Relationship without Navigation PropertyEntity Framework 6 没有导航属性的一对多关系
【发布时间】:2014-03-07 02:48:52
【问题描述】:

我有 2 个表:A 和 B 具有一对多关系,这些表在 EF 6 中实现如下:

public class A
{
    [Key]
    public int AID {get;set;}
    public string AName {get;set;}
}

public class B
{
    [Key]
    public int BID {get;set;}
    public string BName {get;set;}
    public int AID {get;set;}

    [ForeignKey("AID")]
    public A InstanceOfClassA {get;set;}
}

问题

当我从上下文中检索B 时,InstanceOfClassA 始终为空。

假设

由于A实体中没有导航属性引用B,因此实体框架在检索B时不会延迟加载A

期待

因为我不需要从A 访问B,所以我想去掉A 中的导航属性但仍然保留从B 延迟加载A 的能力。

注意

我看到了来自 Map Many to Many relationship without navigation property 的帖子,但这不适合我的情况。

无论如何我可以在不使用显式包含var b = context.B.Include(x => x.InstanceOfClassA); 的情况下强制从B 延迟加载A?也许是自定义约定

编辑 1

我尝试使用以下约定,但仍然没有运气:

modelbuilder.Entity<B>()
    .HasRequired<A>(x => x.InstanceOfClassA);

【问题讨论】:

  • 如果你对我的问题投反对票,请花点时间评论我做错了什么。
  • 我看不出这个问题有什么问题。我花了一些时间研究同样的事情,这样我就不必在从服务发送的所有内容上包含()。我想我最终在加载导航属性的部分类中创建了一个构造函数。不知道这是否适合你。
  • 我也想手动加载依赖。但仍在寻找可以在未来项目中重新使用的解决方案。例如自定义约定,但我不知道如何为这种关系实现自定义约定

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


【解决方案1】:

要使延迟加载正常工作,您必须使用 virtual 关键字标记导航属性:

[ForeignKey("AID")]
public virtual A InstanceOfClassA {get;set;}

【讨论】:

  • 像魅力一样工作!我混淆了急切加载和延迟加载
  • 这仅仅是为了区分延迟加载和急切吗? virtual 似乎有必要让它完全正常工作
猜你喜欢
  • 2020-06-27
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2015-03-29
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多