Ali*_*ran 12 .net c# sql-server entity-framework ef-code-first
考虑以下迁移代码:
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);
Run Code Online (Sandbox Code Playgroud)
我想要RowGuid
be ROWGUIDCOL
,并被定义为这样(SQL):
[RowGuid] [UNIQUEIDENTIFIER] not null RowGuidCol Unique default newid()
Run Code Online (Sandbox Code Playgroud)
什么是等效代码EntityFramework/CodeFirst
?解决办法是什么?
谢谢.
我想您希望将其用于带有列的表格FILESTREAM
。使用 EntityTypeConfiguration 提示 EF 可以使其生成正确的脚本,并且不需要您手动编辑它(EF Core 2.2)。
采取这个样本实体:
public class FileEntity
{
public Guid FileGuid { get; private set; }
public byte[] Document { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
还有这个配置:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
EF 生成正确的迁移脚本:
FileGuid = table.Column<Guid>(type: "UNIQUEIDENTIFIER ROWGUIDCOL", nullable: false),
Document = table.Column<byte[]>(type: "VARBINARY(MAX) FILESTREAM", nullable: true)
Run Code Online (Sandbox Code Playgroud)
似乎无法通过实体框架直接设置 ROWGUIDCOL 属性,但可以通过“创造性”将该属性注入到生成 SQL 中;-) 使用 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);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有办法对此进行测试,但鉴于以下 SQL 有效,我认为值得一试:
CREATE TABLE dbo.Test1
(
Col1 INT NOT NULL,
Col2 UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID()
)
Run Code Online (Sandbox Code Playgroud)
“UNIQUE”要求是通过 Index() 方法中第二个参数为“true”创建的唯一索引来实现的。
请注意,如果表已经具有标记为 IDENTITY 的列,则在 Guid() 方法中使用“identity: true”可能会出现一些问题。我发现这个相关问题可以解决这种情况:Entity Framework Code First using Guid as Identity with another Identity Column