4

Мне нужно сложное уникальное ограничение для свойства объекта Name моего объекта, которое уникально для Category (для которого у него есть FK).Создайте сложное уникальное ограничение/индекс в EF Core

Так что-то вроде этого:

entityTypeBuilder 
    .HasIndex(i => new { i.Name, i.Category.Id }) 
    .IsUnique(); 

Но это терпит неудачу, когда я произвожу миграцию, из-Category.Id свойства навигации.

Я знаю, что могу кодировать значения как строки, но я не хочу потерять статическую типизацию.

Какие у меня варианты?

ответ

4

Добавить внешний ключ для категории CategoryId на объект, о котором идет речь, и использовать его в построителе индексов вместо свойства навигации.

+0

Да, но это грязно. Это единственный вариант? – grokky

+0

Почему вы думаете, что это грязно? Добавление свойства внешнего ключа не является беспорядочным, почему вы так думаете? @grokky – kizilsu

+1

@grokky - Я бы сказал, что не определение свойства внешнего ключа беспорядочно. [Документы EF рекомендуют это] (https://docs.microsoft.com/en-us/ef/core/modeling/relationships#no-foreign-key-property), и я предпочел бы не вводить свойство shadow , – steamrolla

3

Как только вы знаете имя тени свойства, то можно использовать (по крайней мере, в EF ядра 1.1.0) на основе строка HasIndex метод overload

public virtual IndexBuilder HasIndex(params string[] propertyNames) 

например

entityTypeBuilder 
    .HasIndex("Name", "CategoryId" }) 
    .IsUnique(); 

То же самое для HasAlternateKey:

entityTypeBuilder 
    .HasAlternateKey("Name", "CategoryId" }); 
+0

Да, это то, что я сейчас делаю, как я сказал в вопросе, но вы теряете статическую типизацию. Возможно, это единственный способ. – grokky