Использование свойства отслеживания без навигации EF core - PullRequest
1 голос
/ 07 марта 2020

Допустим, у меня есть 2 таблицы: книги и авторы. Они представлены в виде следующих моделей 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, т.е. перед вставкой в ​​базу данных идентификаторы генерируются на клиентском сайте (это стандартное поведение npg sql). внешний ключ к таблице авторов. Итак, допустим, у меня уже есть несколько авторов. Я хотел бы добавить новую книгу какого-то автора. Это веб-приложение, поэтому у меня есть репозитории, введенные в контроллер. Перед вставкой новой книги я загружаю (только для чтения, т.е. AsNoTracking для повышения производительности) доступных авторов, нахожу нужного автора и назначаю этого автора свойству Author вновь созданной книги. На DbContext.SaveChanges я получил сообщение о том, что данный идентификатор уже существует. Я подозреваю, что EF пытается добавить нового Author с заданным идентификатором (даже если он уже существует в базе данных), потому что объект Author был загружен как NoTracking.

Есть ли способ загрузить внешний ключ, так как нет отслеживания для создания новые лица?

Спасибо

1 Ответ

1 голос
/ 07 марта 2020

Поведение метода Add состоит в том, чтобы рекурсивно пометить как Added любую неотслеживаемую сущность, обнаруженную с помощью свойств навигации.

Таким образом, вы должны либо Attach существующую связанные объекты перед вызовом Add, или используйте метод 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...