【发布时间】:2012-05-04 02:31:47
【问题描述】:
错误:
未处理的异常: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 到 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 不,我仍在手动编写迁移脚本。我刚刚提到我已经有一个数据库在生产中,所以我不想更改继承映射方法。
-
我同意这听起来像是在尝试重新创建数据库,因为您使用的是自定义迁移脚本,因此您是否禁用了数据库的重新创建约定?
标签: c# entity-framework ef-code-first