Я использую Fluent API для настройки своих уникальных ограничений (EF 6.2) и имею следующую конфигурацию:
modelBuilder.Entity<TagDTO>().HasIndex(p => new { p.SiteId, p.InputId, p.Name }).IsUnique();
modelBuilder.Entity<TagDTO>().HasIndex(p => new { p.SiteId, p.InputId, p.SqlColumn }).IsUnique();
Таким образом, я могу настроить уникальное ограничение, используя несколько столбцов. Name
и SqlColumn
должны быть незаполненными, если InputId
и SiteId
совпадают.
Я не могу настроить их с помощью атрибутов из-за наследования в моей модели. Для настройки необходимо использовать свободный API.
Теперь проблема в следующем: миграция выглядит следующим образом:
...
.Index(t => new { t.SiteId, t.InputId, t.Name }, unique: true)
.Index(t => t.SqlColumn, unique: true, name: "IX_SiteId_InputId_SqlColumn")
...
И при выполнении этой миграции только Name
правильно настроен в MS SQL. SqlColumn
не имеет уникального ограничения с несколькими столбцами. При переключении двух линий Fluent API SqlColumn
будет правильным, а Name
- неправильным.
Почему индекс на SqlColumn
не настроен для объекта? Это из-за перекрывающихся столбцов (SiteId
и InputId
). Изменение его вручную в SQL работает так, что это возможно.
Это ошибка в EF? У кого-нибудь есть решение этой проблемы?
SiteId
: иностранный ключ к таблице сайта.
InputId
: ForeignKey к таблице ввода.
Name
& SqlColumn
: НЕ первичный ключ, только строковые столбцы
Спасибо.
РЕДАКТИРОВАТЬ: изменение кода миграции вручную работает, но это не может быть решением.
...
.Index(t => new { t.SiteId, t.InputId, t.Name }, unique: true)
.Index(t => new { t.SiteId, t.InputId, t.SqlColumn }, unique: true)
...