Ошибка:
Необработанное исключение: System.Data.SqlClient.SqlException: операция завершилась неудачно, потому что индекс или статистика с именем "IX_ID" уже существуют в таблице "PrivateMakeUpLessons".
Модель (упрощена, построена в отдельном тестовом проекте для отладки):
public abstract class Lesson
{
public Guid ID { get; set; }
public string Room { get; set; }
public TimeSpan Time { get; set; }
public int Duration { get; set; }
}
public abstract class RecurringLesson : Lesson
{
public int DayOfWeek { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public string Frequency { get; set; }
}
public class PrivateLesson : RecurringLesson
{
public string Student { get; set; }
public string Teacher { get; set; }
public virtual ICollection<Cancellation> Cancellations { get; set; }
}
public class Cancellation
{
public Guid ID { get; set; }
public DateTime Date { get; set; }
public virtual PrivateLesson Lesson { get; set; }
public virtual MakeUpLesson MakeUpLesson { get; set; }
}
public class MakeUpLesson : Lesson
{
public DateTime Date { get; set; }
public string Teacher { get; set; }
public virtual Cancellation Cancellation { get; set; }
}
Конфигурация:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Lesson>().ToTable("Lessons");
modelBuilder.Entity<RecurringLesson>().ToTable("RecurringLessons");
modelBuilder.Entity<PrivateLesson>().ToTable("PrivateLessons");
modelBuilder.Entity<MakeUpLesson>().ToTable("PrivateMakeUpLessons");
modelBuilder.Entity<Cancellation>()
.HasOptional(x => x.MakeUpLesson)
.WithRequired(x => x.Cancellation);
base.OnModelCreating(modelBuilder);
}
Примечания:
Это отлично работало в EF 4.2. Что-то не так с моей моделью? Фактическая модель намного сложнее, поэтому у меня все классы абстрагированы. Кроме того, я работаю против существующей базы данных, поэтому мне нужно использовать наследование типа Table-Per-Type.
Если изменить отношение Cancellation
на PrivateMakeUpLesson
от 1 до 0..1 до 0..1 до 0..1, это сработает. Это нежелательно, потому что вы не можете иметь PrivateMakeUpLesson
без Cancellation
.
Кроме того, если я делаю PrivateMakeUpLesson
НЕ наследованным от Lesson
, тогда он также работает, но он является уроком и должен оставаться таким же для существующей бизнес-логики.
Буду признателен за любые рекомендации. Спасибо!
Edit
Запуск щедрости. Я не могу найти документацию о том, что было изменено между EF 4.2 и EF 4.3 в отношении генерации индекса для кода. Ясно, что EF 4.3 создает больше индексов и что схема именования изменилась, но я хочу знать, есть ли ошибка в EF или если что-то принципиально неверно с моей моделью или плавной конфигурацией API.