错误:未处理的异常4.3.1
未处理的异常信息: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,它就起作用。这是不可取的,因为如果没有Cancellation
,就不能有PrivateMakeUpLesson
。
此外,如果我让PrivateMakeUpLesson
不从Lesson
继承,那么它也可以工作,但它是一个教训,需要保留现有的业务逻辑。
我很感激任何指导。谢谢!
编辑:
开始赏金。我无法找到有关EF 4.2和EF 4.3之间在代码优先的索引生成方面发生了什么变化的任何文档。很明显,EF 4.3创建了更多的索引,并且命名方案已经改变,但我想知道EF中是否存在错误,或者我的模型或流利API配置是否存在根本性错误。
你的错误提到你正在使用现有的数据库,但是这个错误看起来更像是EF试图创建和索引 - 这只有在EF修改数据库模式时才会发生。你使用EF迁移? –
@LadislavMrnka不,我仍然手动编写迁移脚本。我刚才提到我已经在生产中有一个数据库,所以我不想更改继承映射方法。 –
我同意这听起来像它尝试重新创建数据库,因为您正在使用自定义迁移脚本,您是否禁用了数据库的重新创建约定? –