EF 6.2 Уникальные ограничения с несколькими (перекрывающимися) столбцами генерируются неправильно - PullRequest
0 голосов
/ 15 ноября 2018

Я использую 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)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...