【问题标题】:Using no tracking navigation property EF core使用无跟踪导航属性 EF 核心
【发布时间】:2020-03-07 21:51:30
【问题描述】:

假设我有 2 个表:Books 和 Authors。它们表示为以下 EF 模型:

class Book {
   Guid Id { get; set; }
   string BookName { get; set; }
   Author Author { get; set; }
}

class Author {
   Guid Id { get; set; }
   string Name { get; set; }
}

两个实体都有自动生成的 Guid Id,即在插入数据库之前,在客户端站点上生成 Id(这是 npgsql 的默认行为) Book 表具有 Author 表的外键。 所以,可以说我已经有几个作者了。我想添加一些作者的新书。这是一个网络应用程序,所以我将存储库注入到控制器中。在插入新书之前,我加载(只读,即 AsNoTracking 以提高性能)可用作者,找到所需的作者并将该作者分配给新创建的书的 Author 属性。在 DbContext.SaveChanges 我得到一个错误,说给定的 Id 已经存在。我怀疑 EF 正在尝试添加具有给定 ID 的新作者(即使它已经存在于数据库中),因为作者实体被加载为 NoTracking。

有没有办法加载外键,因为没有跟踪来创建新实体?

谢谢

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    Add 方法的行为是将通过导航属性发现的任何未跟踪实体递归地标记为Added

    因此,您要么必须在调用 Add 之前 Attach 现有相关实体,要么使用 Entry 方法并将 State 设置为 Added - 在 EF6 中,这与 Add 具有相同的效果,但在 EF Core 中,它只是将实体标记为 Added,而不进行任何导航属性处理。

    例如以下将满足您的要求:

    var book = new Book { BookName = "SomeBook" };
    book.Author = context.Authors.AsNoTracking().First(a => a.Name == "SomeAuthor");
    context.Entry(book).State = EntityState.Added;
    context.SaveChanges();
    

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2023-04-09
      • 2018-09-21
      • 1970-01-01
      相关资源
      最近更新 更多