错误:
未处理的异常:System.Data.SqlClient.SqlException:操作失败,因为表 'PrivateMakeUpLessons' 上已存在名称为 'IX_ID' 的索引或统计信息。
模型(简化,构建在单独的测试项目中进行调试):
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
to的关系PrivateMakeUpLesson
从 1 更改为 0..1 到 0..1 到 0..1,它就可以工作。这是不可取的,因为你不能PrivateMakeUpLesson
没有 a Cancellation
。
此外,如果我让PrivateMakeUpLesson
NOT 继承,Lesson
它也可以工作,但这是一个教训,需要为现有的业务逻辑保持这种状态。
我会很感激任何指导。谢谢!
编辑:
开始赏金。我找不到任何关于 EF 4.2 和 EF 4.3 之间关于代码优先索引生成的变化的文档。很明显,EF 4.3 正在创建更多索引并且命名方案已更改,但我想知道 EF 中是否存在错误,或者我的模型或流畅的 API 配置是否存在根本性错误。