AsNoTracking против HasNoKey - PullRequest
       30

AsNoTracking против HasNoKey

0 голосов
/ 28 сентября 2019

Мне не совсем понятно, в чем разница между использованием AsNoTracking () для объекта, имеющего ключ, и использованием HasNoKey ().Как я понимаю, при использовании AsNoTracking (), даже несмотря на то, что средство отслеживания изменений не отслеживает изменения в результирующих объектах, объекты все еще хранятся в памяти DbContext.Если вы попытаетесь присоединить новый объект с тем же ключом, который уже есть в памяти, вы получите ошибку.(поправьте меня, если я ошибаюсь).

То же самое поведение, если вы используете HasNoKey (бывший DbQuery <>)?

1 Ответ

0 голосов
/ 28 сентября 2019

Представление ModelBuilder.Entity<>().HasNoKey() является одним из критических изменений в EF Core 3.0, как указано:

Тип запроса теперь становится просто типом сущности без первичного ключа.Типы сущностей без ключей имеют ту же функциональность, что и типы запросов в предыдущих версиях.

Типы запросов были средством запроса данных, которые не определяют первичный ключ в структурированном виде.То есть тип запроса использовался для отображения типов сущностей без ключей (более вероятно, из представления, но, возможно, из таблицы), в то время как обычный тип сущности использовался, когда был доступен ключ (более вероятно, из таблицы, но, возможно, изview).

Вы сказали, что:

Если вы попытаетесь присоединить новый объект с тем же ключом, который уже есть в памяти, вы получите ошибку.(поправьте меня если я ошибаюсь).Так будет ли поведение таким же, если вы используете HasNoKey (бывший DbQuery <>)?

- Отслеживание в транзакции EF Core основано на первичном ключе сущности.В приведенной выше документации четко указано, что EntityType с .HasNoKey() равно QueryType, для которого не определен какой-либо ключ.Таким образом, отслеживание полностью аннулируется в случае EntityType с HasNoKey().

Для более подробной информации: Типы запросов объединены с типами сущностей

...