- Как EF выяснил, что такое первичный ключ?
Если явно не указано с помощью атрибута [Key]
или HasKey
свободно API, это Convention :
По соглашению, свойство с именем Id
или <type name>Id
будет настроено как ключ сущности.
Youможно увидеть эту информацию, изучив
var pk = context.Model.FindEntityType(typeof(Entity)).FindPrimaryKey();
Можно ли как-то перенастроить это, чтобы я мог использовать «Найти» для поиска сущностей по имени, но сохранить первичные ключи автоинкремента?
Вы можете лгать EFЯдро использует аннотации данных / свободный API, что PK для Entity
равно Name
, но я не рекомендую это, потому что это приведет к неправильным предположениям для отношений FK, и в целом это плохо.
Вместо этого просто не используйте методы Find
/ FindAsync
, которые предназначены для ПК.First
, FirstOrDefault
, Single
и SingleOrDefault
(и их Async
аналоги) позволяют выполнять поиск по любым критериям, например, вместо FindAsync("abc000")
вы будете использовать FirstOrDefaultAsync(e => e.Name == "abc000")
.
.Единственное отличие состоит в том, что Find
методы сначала выполняют поиск в локальном кэше, что не имеет большого преимущества в большинстве сценариев использования.С другой стороны, методы Find
не поддерживают активную загрузку, в то время как последние поддерживают.Последние выполняются для базы данных, и поскольку для этого столбца существует уникальный индекс, они должны быть достаточно производительными.
Глупо ли я предпочитаю целочисленные ключи с автоинкрементом в качестве полей для объединения таблиц?
Это довольно стандартный дизайн БД и, как правило, предпочтительнее, чем естественные PK, я неЯ не вижу никаких проблем с этим.