2013-05-30 10 views
0

Я ищу способ выполнить несколько более интеллектуальные уникальные ограничения в таблице EF Code First database.Уникальный индекс для внешнего ключа

У меня есть две модели в игре; Установка и арендатор.

public class Setting 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public int TenantId { get; set; } 
} 

public class Tenant 
{ 
    /// 
    public int Id { get; set; } 
    public virtual List<Setting> Settings { get; set; } 
    /// 
} 

Как вы можете догадаться, установка связана с его Арендатором свойством TenantId, который действует в качестве внешнего ключа и соответствовать свойству Id Арендатора.

То, что я хочу достичь, это сказать, что имя параметра должно быть уникальным для каждого арендатора. Например, вы можете иметь настройку с именем «SettingA» в разделе «Tenant01» и «SettingA» в разделе «Tenant02» (каждый из которых представляет собой два отдельных объекта с собственными идентификаторами в таблице и может иметь разные значения), и это быть законным, но не допускать другого параметра «SettingA» для «Арендатора», где он уже существует.

Я могу видеть множество способов просто обеспечить прямую уникальность через такие, как инициализация базы данных и проверка при добавлении и т. Д., Но ничего не «условная уникальность».

+0

, если я хорошо понимаю, что это выглядит как ограничение уникальности на пару [Setting.Name, Настройка. TenantId]? –

+0

Я почти на 100% уверен, что нет никакой структуры для этого встроенного устройства, однако вы можете создать свой собственный атрибут для его обработки. Это было бы довольно прямолинейно. –

ответ

2

Это выглядит как уникальное ограничение на [Setting.Name, Setting.TenantId]

Вы должны иметь правила проверки в «Код стороне», чтобы избежать Sql ошибок при сохранении и UNIQUE CONSTRAINT на вашем дб. .. быть последовательным.

сторона Код

Это может быть легко достигнуто с помощью Lib проверки, как FluentValidation, но вы также можете сделать это с помощью пользовательских атрибутов

Db сторону

миграций

Поверхностный метод:

CreateIndex("dbo.Setting", new[]{"TenantId", "Name"}, true, "Setting_UC"); 

В Нисходящий метод:

DropIndex("dbo.Setting", "Setting_UC"); 

Без миграции

см Unique Constraint in Entity Framework Code First

+0

Это отличное начало для меня. Благодарю вас. =) –

+0

По-видимому: «Столбец« Имя »в таблице« dbo.Settings »имеет тип, который недопустим для использования в качестве ключевого столбца в индексе». Я буду рассматривать это сам, но любые мысли? –

+0

@KiraNamida да, это, вероятно, 'nvarchar (max)'. И 'nvarchar (max)' не принимается для индексов ... Вы должны поместить более низкое значение (например, 'nvarchar (128)' например. –

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