Entity Framework: как установить тип столбца в качестве уникального идентификатора с помощью Fluent API - PullRequest
0 голосов
/ 25 августа 2018

Я использую Entity Framework 6, сначала код.

У меня есть столбец <string> Id, созданный платформой (Azure Mobile Server SDK), к которой у меня нет доступа.

public abstract class EntityData
{
    [Key]
    [TableColumn(TableColumnType.Id)]
    public string Id { get; set; }

    ...
}

Если я не выполняю никаких действий, такой столбец отображается как nvarchar(MAX) в SQL Server.

Мне удалось превратить его в char(36) с помощью этого фрагмента в Fluent API:

PropertyConventionConfiguration pkConf = modelBuilder.Properties<string>().Where(p => p.Name == "Id");
pkConf.Configure(p => p.IsUnicode(false));
pkConf.Configure(p => p.HasMaxLength(36));
pkConf.Configure(p => p.IsFixedLength());

Я хочу установить его как uniqueidentifier.

Как я могу сделать это с помощью похожего фрагмента кода Fluent API?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вот, пожалуйста:

 modelBuilder.Entity<TodoItem>().Property(t => t.Id).HasColumnType("UniqueIdentifier");

Дополнительная информация для справки:

Настройка типа данных столбца базы данных

0 голосов
/ 27 августа 2018

Вы можете использовать пользовательский конвертер значений или использовать встроенный GuidToStringConverter : docs.microsoft.com / en-us / ef / core / моделирование / преобразование значений .Несколько замечаний - вы должны создать класс, который наследуется от этого абстрактного класса.Это не только обеспечивает уровень абстракции, но и позволяет вам более точно контролировать, как вы храните и обращаетесь к своим данным.Кроме того, как вы, наверное, знаете, GUID делают ужасные PK!

EDIT:

Если вы используете EF 6, эта функция будет недоступна.Поэтому вам нужно будет создать свойство оболочки или использовать хранимую процедуру.Вот пример, пример кода можно найти здесь: https://github.com/ibrahm2/entityframework6-map-string-to-guid

Метод 1: свойство Wrapper

  1. Создайте класс, который наследуется от EntityData.Для этого примера давайте назовем его WrapperTable например
  2. Добавьте свойство с именем Id с типом Guid и замаскируйте свойство base Id с помощью модификатора new.Пусть он вернет приведенную версию Id из базового класса как Guid.Это замаскирует базовое свойство.Это не лучшая практика, поэтому, если вам это неудобно, альтернативой может быть создание нового свойства, например с именем Key, которое охватывает Id.
  3. Если ваша конфигурация соответствуетнаследуемый класс для таблицы EntityDate.

    modelBuilder.Entity (). ToTable ("EntityData");

Метод 2: Хранимая процедура

  1. Создать хранимую процедуру, которая принимает varchar в качестве параметра для поля Id
  2. Сопоставить хранимую процедуру с функцией вставки сущности, например:

    modelBuilder.Entity (). MapToStoredProcedures (prop => prop.Insert (sp => sp.HasName ("sp_InsertTable"). Параметр (pm => pm.Id, "@id")));

  3. Попросите хранимую процедуру вставить varchar в поле вашего уникального идентификатора.

...