Как указать свойство ROWGUIDCOL для столбца типа Guid в коде сначала или с помощью ColumnBuilder?

Рассмотрим этот код миграции:

       CreateTable(
            "dbo.Document",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Doc = c.String(),
                    RowGuid = c.Guid(nullable: false),
                    Person_Id = c.Int(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.Person", t => t.Person_Id)
            .Index(t => t.Person_Id);

Я хочу, чтобы RowGuid был ROWGUIDCOL, и определяется как это (SQL):

 [RowGuid] [UNIQUEIDENTIFIER] not null RowGuidCol Unique default newid()

Что такое эквивалентный код в EntityFramework/CodeFirst? Каково решение?

Спасибо.

Ответ 1

Не похоже, что свойство ROWGUIDCOL может быть установлено непосредственно через Entity Framework, но возможно было бы добавить свойство в SQL файл, создав "creative";-) использование параметра storeType (предполагая, что storeType действительно позволяет вы должны переопределить тип данных по умолчанию). Начиная с кода исходного вопроса, попробуйте следующее:

 CreateTable(
            "dbo.Document",
            c => new
                {
                    RowGuid = c.Guid(nullable: false, identity: true,  
                                     defaultValueSql: "newid()",
                                     storeType: "UNIQUEIDENTIFIER ROWGUIDCOL"),
                    Person_Id = c.Int()
                })
            .Index(t => t.RowGuid, true);

К сожалению, у меня нет возможности проверить это, но, учитывая, что работает следующий SQL, я думаю, что это стоит сделать:

CREATE TABLE dbo.Test1
(
    Col1 INT NOT NULL,
    Col2 UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID()
)

Требование "UNIQUE" выполняется с помощью уникального индекса, созданного вторым параметром "true" в методе Index().

Обратите внимание, что может возникнуть проблема с использованием "identity: true" в методе Guid(), если в таблице уже есть столбец с меткой IDENTITY. Я нашел этот связанный вопрос, который обращается к этой ситуации: Код структуры Entity Framework Сначала используйте Guid как идентификатор с другой колонкой Identity

Ответ 2

После некоторых исследований и опроса, я не думаю, что это возможно. Способ, которым я обходился в своем коде, - это получить новый GUID, когда я новичок в объекте:

    public class MyPOCO {
           public MyPOCO() { 
                RowGuid = Guid.NewGuid();
           }
      //.....
   }

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

Ответ 3

Я полагаю, вы хотите это для таблицы со столбцом FILESTREAM. Подсказка EF с помощью EntityTypeConfiguration позволяет генерировать правильные сценарии и не требует ручного редактирования (EF Core 2.2).

Взяв этот пример сущности:

public class FileEntity
{
    public Guid FileGuid { get; private set; }
    public byte[] Document { get; private set; }
}

И эта конфигурация:

public class FileEntityConfiguration : IEntityTypeConfiguration<FileEntity>
{
    public void Configure(EntityTypeBuilder<FileEntity> builder)
    {
        builder
            .Property(m => m.Document)
            .HasColumnType("VARBINARY(MAX) FILESTREAM");

        builder
            .Property(m => m.FileGuid)
            .HasColumnType("UNIQUEIDENTIFIER ROWGUIDCOL")
            .IsRequired();

        builder
            .HasAlternateKey(m => m.FileGuid);
    }
}

EF генерирует правильный скрипт миграции:

FileGuid = table.Column<Guid>(type: "UNIQUEIDENTIFIER ROWGUIDCOL", nullable: false),
Document = table.Column<byte[]>(type: "VARBINARY(MAX) FILESTREAM", nullable: true)