我对在几个对象之间正确设置实体框架有疑问。 三个对象/表是: 公司,订单,渠道 公司是订单中的一对多 公司是渠道之一 渠道是订单中的一对多
当我按如下方式设置它时,我得到“可能导致循环或多个级联路径”错误。
public class Order
{
/// <summary>
/// System Generator OrderNumber
/// </summary>
[Key]
public int ID { get; set; }
/// <summary>
/// Company associated to this order
/// </summary>
[ForeignKey("MerchantId")]
public virtual Company { get; set; }
public int CompanyId { get; set; }
/// <summary>
/// ID of the channel that provided this information
/// </summary>
[ForeignKey("SourceChannelId")]
public virtual Channel { get; set; }
public int ChannelId { get; set; }
}
public class Company
{
public List<Order> Orders{get;set;}
public List<Channel> Channels{get;set;}
}
public class Channel
{
public List<Order> Orders{get;set;}
}
我知道我可以通过去渠道然后去公司来消除与公司的联系,但是有一种情况是订单可能没有渠道。但是,从来没有订单不会有公司的情况。还有第三个对象具有一对多的关系,但如果我让前两个正常工作,我可以弄明白:)
我更喜欢使用dataannotations方法,但是流利也很好。
答案 0 :(得分:0)
这不仅仅是实体框架的问题,而是SQL的问题。即便如此,你也无法做同样的事情。
默认情况下,Entity Framework设置为在删除父级时创建级联删除。
想象一下这个场景:
您为实体A触发删除,实体A现在有两个实体C的删除路径:
这是SQL无法处理的,因为它不知道哪条路径具有优先级,这称为多个级联删除路径。
只有一种方法可以解决这个AFAIK,它需要流畅的API。您需要将实体C的一个FK设置为Cascade Delete = false。
可以在Entity Framework中全局关闭级联删除,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
修改强>
这将删除从A到C的删除路径,但将保留A-B-C路径。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Company>()
.HasMany(x => x.Orders)
.WithRequired(x => x.Company)
.WillCascadeOnDelete(false);
}