Morning,我使用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&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约束"FK_dbo.DeviceA_dbo.Devices_DeviceId"冲突。冲突发生在数据库"CodeFirst"的表"dbo.DeviceA"的列"DeviceId"中。
据我所知,根据MSDN文档http://msdn.microsoft.com/en-us/data/jj591620.aspx(在启用级联删除的标题部分下),它指出。如果依赖实体上的外键不可为null,则"代码优先"将对关系设置级联删除。如果依赖实体上的外键可以为null,则Code First不会对关系设置级联删除,并且删除主体时,外键将设置为null
但是,在尝试了几个小时后,我仍然无法级联删除超类中的记录a。请告知。谢谢
尝试映射外键:
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);
}