Я просто практиковал сначала первую структуру сущности базы данных из msdn, я хочу знать, может ли быть создана таблица без первичного ключа в коде первой новой базы данных EF?
Можем ли мы иметь таблицу без первичного ключа в структуре сущностей?
Ответ 1
Нет, вы не можете, потому что Entity Framework должен знать ключ, чтобы отслеживать объект при выполнении операции обновления или удаления.
Во всяком случае, неплохо иметь таблицу без PrimaryKey
Ответ 2
Существует большая разница между тем, что EF может делать с базой данных и что возможно с базой данных.
Большинство баз данных позволяют использовать таблицу без первичного ключа. Большинство баз данных также позволяют использовать таблицу без кластеризованного индекса/индексной таблицы (или того, что когда-либо является конкретным термином для других систем баз данных).
В этом нет ничего плохого, и нельзя утверждать, что это плохая идея иметь таблицу без ПК.
Как всегда, это зависит от потребностей и использования конкретной таблицы. например, таблица журналов, не требуется ПК. Он никогда не будет использоваться как FK, так что он использует?
Нижняя линия, EF не поддерживает таблицы без ключа из коробки, есть некоторые странные обходные пути, но ни один из тех, что я видел, достаточно хорош. Это стыд.
Ответ 3
- Entity Framework должен иметь ключ, идентифицированный на объекте (класс POCO), который моделирует таблицу.
- Ключ, который вы определяете в Entity Framework, НЕ должен присутствовать в базовой базе данных (например, в sql-таблице).
Если в вашей таблице SQL нет первичного ключа, вы все равно можете моделировать его в Entity Framework, вам просто нужно определить ключ для этого Entity. Выберите один или несколько (возможно всех) столбцов в Entity, которые при объединении однозначно идентифицируют этот экземпляр в коллекции объектов. Обратите внимание, что это важно только для обновления или удаления объектов, поскольку они должны быть однозначно идентифицированы против других в этой коллекции для целей изменения. Поиск/выбор и добавление/вставка не требуют такой согласованности.
Ответ 4
Иногда добавление PK невозможно, так как это может быть только защищенная от чтения база данных клиента, которую вы должны использовать. EF выдает исключение даже при выполнении операций SELECT. Когда я столкнулся с этим вопросом, я смог решить его так (имена искусственны):
[Table( "WeirdTable", Schema = "SomeSchema" )]
public class WeirdTable
{
[Column( "ID1" )]
public int Id1 { get; set; }
[Column( "ID2" )]
public int Id2 { get; set; }
}
В файле кода контекста:
protected override void OnModelCreating( DbModelBuilder model_builder )
{
base.OnModelCreating( model_builder );
model_builder.Entity<WeirdTable>().HasKey(
t => new { t.Id1, t.Id2 }
);
}
Поэтому вам просто нужно указать, какие столбцы могут быть первичным ключом.
Ответ 5
Начиная с .NET Core 2.1, EF Core поддерживает модели без первичного ключа.
Это реализуется через концепцию типов запросов вместо типов начальных.
См. Https://docs.microsoft.com/en-us/ef/core/modeling/query-types.
Некоторые из основных сценариев использования для типов запросов:
- Служит типом возврата для специальных запросов FromSql().
- Сопоставление с представлениями базы данных.
- Сопоставление с таблицами, для которых не определен первичный ключ.
- Отображение на запросы, определенные в модели.
Типы запросов имеют ограничения, хотя. Они не могут быть вставлены, обновлены или удалены в базе данных. И они имеют только ограниченную поддержку навигационных свойств.