实体框架代码第一个多个对象设置

时间:2013-09-20 21:55:40

标签: entity-framework foreign-key-relationship

我对在几个对象之间正确设置实体框架有疑问。 三个对象/表是: 公司,订单,渠道 公司是订单中的一对多 公司是渠道之一 渠道是订单中的一对多

当我按如下方式设置它时,我得到“可能导致循环或多个级联路径”错误。

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方法,但是流利也很好。

1 个答案:

答案 0 :(得分:0)

这不仅仅是实体框架的问题,而是SQL的问题。即便如此,你也无法做同样的事情。

默认情况下,Entity Framework设置为在删除父级时创建级联删除。

想象一下这个场景:

  • 您有实体A
  • 您有实体B,其中FK为实体A
  • 您有实体C,其中FK为实体A,FK为实体B

您为实体A触发删除,实体A现在有两个实体C的删除路径:

  • C通过FK删除到A
  • C通过FK删除到B,通过FK删除到A

这是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);

}