Можем ли мы иметь таблицу без первичного ключа в рамках сущности?

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

4 ответа

Решение

Нет, вы не можете, потому что Entity Framework должен знать ключ для отслеживания объекта при выполнении операции обновления или удаления.

В любом случае, не рекомендуется иметь таблицу без PrimaryKey.

Существует большая разница между тем, что EF может делать с базой данных, и тем, что возможно с базой данных.

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

В этом нет ничего плохого, и не следует утверждать, что иметь таблицу без ПК - плохая идея.

Как всегда, это зависит от потребностей и использования конкретной таблицы. например, таблица журнала, не нуждается в ПК. Он никогда не будет использоваться в качестве FK, так что же он будет использовать?

В итоге, EF не поддерживает таблицы без ключа из коробки, есть некоторые странные обходные пути, но ни один из тех, что я видел, не достаточно хорош. Это стыд.

  1. Entity Framework должен иметь ключ, идентифицируемый для объекта (класс POCO), который моделирует таблицу.
  2. Ключ, который вы определяете в Entity Framework, НЕ обязательно должен присутствовать в базовой базе данных (например, таблица sql).

Если ваша таблица SQL не имеет первичного ключа, вы все равно можете смоделировать его в Entity Framework, вам просто нужно определить ключ для этого Entity. Выберите один или несколько (возможно, все) столбцов в сущности, которые при объединении будут однозначно идентифицировать этот экземпляр в коллекции сущностей. Обратите внимание, что это важно только для обновления или удаления сущностей, так как они должны быть однозначно идентифицированы с другими в этой коллекции, чтобы нацелить изменение. Поиск / выбор и добавление / вставка не требуют такой согласованности.

Иногда добавить 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 }
    );
}

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

Начиная с.NET Core 2.1, EF Core поддерживает модели без первичного ключа.
Это реализуется через концепцию типов запросов вместо типов начальных.
См. https://docs.microsoft.com/en-us/ef/core/modeling/query-types

Некоторые из основных сценариев использования для типов запросов:

  • Служит типом возврата для специальных запросов FromSql().
  • Сопоставление с представлениями базы данных.
  • Сопоставление с таблицами, для которых не определен первичный ключ.
  • Отображение на запросы, определенные в модели.

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

EF.Core 5 будет иметь [Keyless]атрибут, позволяющий иметь сущность без ПК. Но он все еще находится в стадии разработки.

EF.Core 5 что нового

Другие вопросы по тегам