2014-04-08 27 views
2

我試圖達到的是AbstractUser和Plant之間使用TPT繼承的NM關係。使用TPT方法的多對多實體框架

enter image description here

當我嘗試配置的關係,

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

我得到以下exeption:

其他信息:引進國外KEY約束 「FK_dbo.UserHasRemindedPlant_dbo.AbstractUsers_AbstractUser_Id ' 表'UserHasRemindedPlant'可能導致循環或多個級聯 路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

如何在tpt抽象實體的多對多關聯上設置ON DELETE或ON UPDATE動作?

當我使用上面的代碼行時,一切正常,但我需要其他實體的這個約定。

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

這裏我的實體類:

AbstractUser

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; } 
} 

Studend

[Table("Student")] 
public class Student : AbstractUser 
{ 
    //some unrelevant props here 

} 

教師

[Table("Teacher")] 

public class Teacher : AbstractUser 
{ 
    //some unrelevant props here 

} 
+0

的問題是其他地方。如果它在刪除「OneToManyCascadeDeleteConvention」時起作用,則問題不能是多對多關係。例如'Plant'對用戶(AbstractUser或派生用戶之一)有一個(必需的)引用?這確實會導致從'AbstractUser'表到'UserHasRemindedPlant'表的多個刪除路徑並拋出異常。 – Slauma

回答

1

必須禁用級聯用流利的API .WillCascadeOnDelete(false)刪除:

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

感謝您的回覆。出於某種原因,Visual Studio無法在WithMany()之後解析WillCascadeOnDelete(false)。這在EF6之後改變了嗎? – Nando

+0

您使用哪個版本的EF? –

+0

EF:6.0.2 Dot.Net:4.5 – Nando