gpt4 book ai didi

c# - 导航属性的唯一约束

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:07 24 4
gpt4 key购买 nike

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

最佳答案

使用此模型,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])

关于c# - 导航属性的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31018421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com