gpt4 book ai didi

entity-framework-core - 如何防止 EF7 急于修复导航属性?

转载 作者:行者123 更新时间:2023-12-04 02:58:49 26 4
gpt4 key购买 nike

我在 Web 应用程序中使用 EF7 时遇到问题,我可以使用该应用程序获得一些帮助。我目前正在使用 EF7 RC1。

这里有一些模型可以说明我的问题。

联系方式

public class Contact
{
public Guid Id { get; set; }

public string Desc { get; set; }
public ContactType ContactType { get; set; }
}

联系方式
public class ContactType
{
public Guid Id { get; set; }
public string Desc { get; set; }

public ICollection<Contact> Contacts { get; set; }
}

这些模型通过 Fluent API 关联,如下所示:
modelBuilder.Entity<Contact>(entity => {
// abridged for clarity

entity
.HasOne(c => c.ContactType)
.WithMany(ct => ct.Contacts)
.IsRequired();
});

我的需求是能够从加载了 ContactType 属性的数据库中检索联系人实体的集合。 EF 使这很容易:
using(var context = new MyDbContext()) {
var contacts = await context
.Contacts
.Include(c => c.ContactTypes)
.Where(/* some search criteria */)
.ToListAsync();
}

问题在于,在加载 Contact 实体的 ContactType 属性时(由于在查询中调用 .Include() 会发生这种情况),EF 还有助于加载每个 ContactType 实体的 Contacts 属性,从而导致指向 Contacts 的无限链在 ContactTypes 和 ContactTypes 指向联系人。我理解为什么这是默认行为并且它在许多情况下很有用,但我的需求是将这些实体序列化为 JSON 并将它们发送到客户端 - 这是一种只读情况。

我想要的行为是让 EF 返回一组联系人,这些联系人具有已加载(非空)的 ContactType 属性,这些属性的 Contacts 属性设置为 null。这是EF可以做的吗?有什么方法可以结束我想要的对象图,而不是手动将我不想填充的属性清空?

我尝试过的事情:
  • 将 .AsNoTracking() 附加到 EF 查询(这似乎并没有停止
    ContactType 实体的 Contacts 属性不会被加载)
  • 告诉 Json.NET 不要序列化无限引用循环(这是
    需要在序列化过程中避免无限递归,但仍然
    导致大量额外数据被序列化)
  • 最佳答案

    您无法避免 EF 加载 ContactType.Contacts 集合,因为它实际上并没有加载它,而是使用加载的 Contact 实例填充集合。
    这就是为什么使用 AsNoTracking 没有效果的原因,因为这不是延迟加载或 ChangeTracker 的问题。

    您有三种可能的解决方案:

  • 使用 Json.NET ReferenceLoopHandling = ReferenceLoopHandling.Ignore ,但正如您所说,它会生成大量不必要的数据,因为您将获得每个 ContactType
  • 的 Contacts 集合。
  • 使用 [JsonIgnore] ContactType.Contacts 上的属性,因此序列化程序将忽略它。但是它总是会忽略它,不知道你在其他情况下是否需要它
  • 定义一个 DTO,使用 Automapper 之类的东西来映射你的数据(没有联系人集合)并序列化它

  • 我更喜欢第三个选项,因为我不喜欢向客户端发送域模型对象,并且它避免向与域无关的域模型添加属性。

    关于entity-framework-core - 如何防止 EF7 急于修复导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35438600/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com