2015-06-24 3 views
2

Мне нужно установить уникальное ограничение на несколько свойств объекта 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

С помощью этой модели 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]) 
+0

Таким образом, в сущности, единственный способ решить эту проблему, чтобы добавить ключевое свойство иностранного? Я вижу, как это работает, но это кажется немного грязным. Я посмотрю, есть ли у кого-то более чистое решение, прежде чем тикать как ответ, но спасибо за ответ! –

+1

Есть также 2 других способа. Первый - создать индекс с миграцией кода (мне это действительно не нравится). Второй (не совсем новый способ, просто способ сделать решение выше немного чище) состоит в том, чтобы сделать свойство parent_FooId частным, а затем отобразить его с помощью свободного интерфейса (он должен быть внутренним классом внутри бара). По крайней мере, пользователи Bar не видят parent_FooId prop ... – bubi

Смежные вопросы