我需要在EF对象的多个属性上放置一个唯一约束。其中一个属性是对象(导航属性)
public class foo
{
[Key]
public int FooID {get; set;}
<other properties here>
}
public class bar
{
[Key]
public int barID {get;set;}
[Index("IX_UniqueWithinFoo", 0, IsUnique = true)]
public virtual foo parent {get;set;}
[Index("IX_UniqueWithinFoo", 1, IsUnique = true)]
public int order {get; set;}
}
我找不到任何文档来确定这是否是正确的方法,特别是因为插入foo
对象时不会等同。
答案 0 :(得分:1)
使用此模型,EF会创建以下表/索引/约束
CREATE TABLE [Bars] (
[barID] int not null identity(1,1)
, [order] int not null
, [parent_FooID] int null
);
ALTER TABLE [Bars] ADD CONSTRAINT [PK_Bars_8873614b] PRIMARY KEY ([barID])
CREATE TABLE [Foos] (
[FooID] int not null identity(1,1)
);
ALTER TABLE [Foos] ADD CONSTRAINT [PK_Foos_8873614b] PRIMARY KEY ([FooID])
CREATE UNIQUE INDEX [IX_UniqueWithinFoo] ON [Bars] ([order])
CREATE INDEX [IX_parent_FooID] ON [Bars] ([parent_FooID])
ALTER TABLE [Bars] ADD CONSTRAINT [FK_Bars_Foos_parent_FooID] FOREIGN KEY ([parent_FooID]) REFERENCES [Foos] ([FooID])
查看第二个创建的索引... EF完全忽略索引名称和唯一约束。我认为这可能被视为一个错误。
如果要解决问题,则需要在类Bar中为关系插入属性(至少如果使用数据注释)并在其上设置唯一索引。
public class Bar
{
[Key]
public int barID {get;set;}
[Index("IX_UniqueWithinFoo", 0, IsUnique = true)]
public int parent_FooId { get; set; }
[ForeignKey("parent_FooId")]
public virtual Foo parent { get; set; }
[Index("IX_UniqueWithinFoo", 1, IsUnique = true)]
public int order { get; set; }
}
在这种情况下,只创建一个索引,索引为
CREATE UNIQUE INDEX [IX_UniqueWithinFoo] ON [Bars] ([parent_FooId], [order])