【问题标题】:EF Core Navigation Property CycleEF Core 导航属性循环
【发布时间】:2018-10-10 19:00:36
【问题描述】:

考虑以下

型号:

public class Blog
{
    public Guid ID {get; set;}
    public string Name {get; set;}
    // more fields...

    // Navigation Property
    public IList<Post> Posts {get; set;}
}

public class Posts
{
    public Guid ID {get; set;}
    public Guid BlogID {get; set;}
    public string Author {get; set;}
    // more fields...

    // Navigation Property
    public Blog Blog {get; set;}
}

DbContext.OnModelCreating中:

// Primary Keys
modelBuilder.Entity<Blog>()
            .HasKey(c => c.ID);

modelBuilder.Entity<Post>()
            .HasKey(c => c.ID);

modelBuilder.Entity<Blog>()
            .HasMany(c => c.Posts)
            .WithOne(c => c.Blog)
            .HasForeignKey(c => c.BlogID)
            .HasPrincipalKey(c => c.ID);

modelBuilder.Entity<Post>()
            .WithOne(c => c.Blog)
            .HasMany(c => c.Posts)     
            .HasForeignKey(c => c.BlogID)
            .HasPrincipalKey(c => c.ID);

这一切都有效,问题是然后我获取一个 Blog 它包含一个 Post 包含 Blog 列表,其中包含 帖子,每个帖子都包含博客 等等。

如何将其限制为特定级别的嵌套? 我查了docs,没找到解决办法。

【问题讨论】:

  • 为什么这是个问题? EF 的作用是进行 LazyLoading,因此当您单击或获取下一个属性时,它会前往数据库并为您获取。
  • 目前还没有延迟加载。但是导航属性只是链接在一起。所以blog,Posts[0].Blog == blog。这不是嵌套,属性指向同一个对象。

标签: c# .net-core entity-framework-core ef-core-2.0


【解决方案1】:

我认为您根本无法限制这一点。但我也不认为这会导致任何问题。

EntityFramework 正在处理navigation properties,方法是用对数据库的实际查询替换(覆盖)它们的功能。这种方法称为LazyLoading

这意味着,每次您访问该属性时,它都会调用数据库并为您带来数据,并且它可以按照您的要求永远执行此操作。

我希望这能解释清楚吗?

更多解释可参见here

问候

【讨论】:

  • 有没有办法在没有导航属性的情况下使用 fluent api 创建关系?
  • 首先,您为什么认为这是个问题?我认为没有导航属性就无法进行重新关系。您可以将其转换为 EagerLoading 而不是 LazyLoading,然后它将包含您包含的数据,仅此而已。
  • 是的,这不是我同意的选项。你用什么来做映射?
  • 我很确定你可以在 Automapper 中设置它。不过我记不得了。
  • 这是不正确的答案。没有延迟加载。导航属性没有被虚拟化。无论您使用哪种方式填充导航,EF 都会进行修复,因此导航的两侧都将相互指向。这是您需要处理的典型序列化问题。
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 2022-01-04
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多