【发布时间】:2014-05-21 08:34:34
【问题描述】:
我试图达到的是 AbstractUser 和 Plant 之间的 NM 关系,用于 TPT 继承。
当我尝试配置关系时,
modelBuilder.Entity<Plant>().HasMany(c => c.RemindedByUsers).WithMany().Map(m =>
{
m.ToTable("UserHasRemindedPlant");
});
我得到以下异常:
附加信息:引入 FOREIGN KEY 约束 'FK_dbo.UserHasRe MindPlant_dbo.AbstractUsers_AbstractUser_Id' on 表 'UserHasRemittedPlant' 可能会导致循环或多个级联 路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改 其他 FOREIGN KEY 约束。
如何对 tpt 抽象实体上的多对多关系设置 ON DELETE 或 ON UPDATE 操作?
当我使用上面的行时,一切正常,但我需要对其他实体使用此约定。
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
这里是我的实体类:
抽象用户
public abstract class AbstractUser
{
protected AbstractUser()
{
RemindedPlants = new Collection<Plant>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
...
[Required]
public SchoolYear SchoolYear { get; set; }
public virtual ICollection<Plant> RemindedPlants { get; private set; }
}
学生
[Table("Student")]
public class Student : AbstractUser
{
//some unrelevant props here
}
老师
[Table("Teacher")]
public class Teacher : AbstractUser
{
//some unrelevant props here
}
【问题讨论】:
-
问题出在其他地方。如果在删除
OneToManyCascadeDeleteConvention时它有效,则问题不可能是多对多关系。例如,Plant是否有(必需的)对用户(AbstractUser 或派生用户之一)的引用?这确实会导致从AbstractUser表到UserHasRemindedPlant表的多个删除路径并抛出异常。
标签: c# entity-framework many-to-many table-per-type