c# - 使用 TPT 方法的多对多 Entity Framework

标签 c# entity-framework many-to-many table-per-type

我试图达到的是使用 TPT 继承的 AbstractUser 和 Plant 之间的 NM 关系。

enter image description here

当我尝试配置关系时,

modelBuilder.Entity<Plant>().HasMany(c => c.RemindedByUsers).WithMany().Map(m =>
{
    m.ToTable("UserHasRemindedPlant");
});

我得到以下异常:

Additional information: Introducing FOREIGN KEY constraint 'FK_dbo.UserHasRemindedPlant_dbo.AbstractUsers_AbstractUser_Id' on table 'UserHasRemindedPlant' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

如何在 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

}

最佳答案

您必须使用 Fluent API .WillCascadeOnDelete(false) 禁用级联删除:

modelBuilder.Entity<Plant>().HasMany(c => c.RemindedByUsers).WithMany().WillCascadeOnDelete(false).Map(m =>{
m.ToTable("UserHasRemindedPlant");});

关于c# - 使用 TPT 方法的多对多 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940562/

相关文章:

c# - 使用 IE 而不是默认浏览器打开 url

c# - 什么是有效的 Entity Framework 查询来检查用户是否是 friend ?

mysql - 配对表查询

c# - 强制 Entity Framework 6 查询使用正确的索引

database - 数据库设计 : efficiency consideration when adding an intermediate class into a Many-Many relationship

mysql - 删除操作-具有多对多关系的多个表

c# - ASP.NET 使用 ASHX 返回 JSON

c# - 如何在 C# < 4 中根据参数的运行时类型分派(dispatch)到方法?

c# - C#中的正则表达式条件问题

C# "painless"调用带有参数的存储过程的方法?