我使用Fluent API配置我的唯一约束(EF 6.2),并具有以下配置:
modelBuilder.Entity<TagDTO>().HasIndex(p => new { p.SiteId, p.InputId, p.Name }).IsUnique();
modelBuilder.Entity<TagDTO>().HasIndex(p => new { p.SiteId, p.InputId, p.SqlColumn }).IsUnique();
这样,我可以使用多个列配置唯一约束。如果Name
和SqlColumn
相同,则InputId
和SiteId
必须不存在。
由于模型中的继承关系,我无法使用属性来配置这些属性。必须使用Fluent API进行配置。
现在的问题是:迁移的迁移看起来像这样:
...
.Index(t => new { t.SiteId, t.InputId, t.Name }, unique: true)
.Index(t => t.SqlColumn, unique: true, name: "IX_SiteId_InputId_SqlColumn")
...
在执行此迁移时,在MS SQL中仅正确配置了Name
。 SqlColumn
没有具有多列的唯一约束。切换两条Fluent API行时,SqlColumn
是正确的,而Name
是错误的。
为什么SqlColumn
上的索引没有配置对象?是因为列(SiteId
和InputId
)重叠造成的。在SQL中手动更改它是可行的,因此成为可能。
这是EF中的错误吗?有没有人解决这个问题?
SiteId
:表站点的ForeignKey。
InputId
:表Input的ForeignKey。
Name
和SqlColumn
:不是主键,只是字符串列
谢谢。
编辑:确实可以手动更改迁移代码,但这不是解决方案。
...
.Index(t => new { t.SiteId, t.InputId, t.Name }, unique: true)
.Index(t => new { t.SiteId, t.InputId, t.SqlColumn }, unique: true)
...