导航属性的唯一约束

时间:2015-06-24 05:39:28

标签: c# entity-framework

我需要在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对象时不会等同。

1 个答案:

答案 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])
相关问题