Как указать свойство 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)