早上,我使用Code First构建我的数据库,并实现了每种类型表(TPT)方法的继承层次结构。以下是我项目的示例模型:
public enum Type
{
A = 0,
B = 1
}
public abstract class Device
{
public int DeviceId { get; set; }
public Type Type { get; set; }
}
[Table("DeviceA")]
public class DeviceA : Device
{
public int Value { get; set; }
}
[Table("DeviceB")]
public class DeviceB : Device
{
public int Value { get; set; }
}
我有一张桌子,与A& A有关。 B.模型如下所示:
public class Sir
{
public int SirId { get; set; }
[Required]
public virtual DeviceA DeviceA { get; set; }
public virtual DeviceB DeviceB { get; set; }
}
OnModelCreating函数如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Sir>()
.HasRequired(s => s.DeviceA)
.WithMany()
.WillCascadeOnDelete(true);
modelBuilder.Entity<Sir>()
.HasOptional(s => s.DeviceB)
.WithMany()
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
当我尝试删除超类中的设备时出现问题。提示SQL错误:
DELETE语句与REFERENCE约束冲突&#34; FK_dbo.DeviceA_dbo.Devices_DeviceId&#34;。冲突发生在数据库&#34; CodeFirst&#34;,table&#34; dbo.DeviceA&#34;,column&#39; DeviceId&#39;。
据我了解,根据http://msdn.microsoft.com/en-us/data/jj591620.aspx中的MSDN文档(在启用级联删除的标题部分下),它指出。如果依赖实体上的外键不可为空,则Code First会在关系上设置级联删除。如果依赖实体上的外键可以为空,则Code First不会在关系上设置级联删除,并且当删除主体时,外键将设置为null。
但是,在尝试了几个小时之后,我无法级联删除超类中的记录A. 请指教。谢谢 !
答案 0 :(得分:0)
尝试映射外键:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Sir>()
.HasRequired(s => s.DeviceA)
.WithMany()
.Map(m => m.MapKey("DeviceA_Id"))
.WillCascadeOnDelete(true);
modelBuilder.Entity<Sir>()
.HasOptional(s => s.DeviceB)
.WithMany()
.Map(m => m.MapKey("DeviceB_Id"))
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}