如何使用相同模型中的一对多和一对一来以正确的顺序插入实体框架

时间:2016-05-13 08:58:09

标签: c# entity-framework

以下是基本型号:

OrderGroup:

public virtual int OrderGroupId { get; protected set; }
public virtual ICollection<Order> Orders { get; set; }
public virtual Order UnpricedOrder { get; set; }

订单:

public virtual int OrderId { get; protected set; }
public virtual int OrderGroupId { get; protected set; }
public virtual OrderGroup OrderGroup { get; set; }

用流畅的API:

// Order group config
var orderGroup = modelBuilder.Entity<OrderGroup>();
orderGroup.HasOptional(og => og.UnpricedOrder)
                  .WithOptionalDependent()
                  .Map(og => og.MapKey("UnpricedOrderId"));

// Order config
var order = modelBuilder.Entity<Order>();
order.HasRequired(o => o.OrderGroup)
                  .WithMany(og => og.Orders)
                  .HasForeignKey(o => o.OrderGroupId);

因此,orderGroup拥有许多自己的订单,每个订单属于一个组,订单组可以选择引用一个未定价的订单。

我已经在订单组中有一个已经保存到数据库中的订单。

我现在创建第二个'未定价'订单,给它自己的组,然后调用保存更改。

实体框架尝试在其自己的订单组和外键错误发生之前首先插入未定价的订单。

作为一个人,我明白这一点 a)保存订单时 - 必须先创建订单组

我想实体框架变得混乱,因为如果我保存订单组并且它有一个未定价的订单那么插入的顺序需要是 未定价订单的订单组 - &gt;未定价订单 - &gt;订单组 - &gt;这是订单。

当有时需要先保存父级时,如何让实体框架以正确的顺序保存 - 但不是每次都保存。

2 个答案:

答案 0 :(得分:0)

orderGroup.HasOptional(og => og.UnpricedOrder)
              .WithOptionalDependent()

你说订单是这种关系中的主体。因此必须首先创建订单。但OrderGroupID不可为空,因此无法先创建订单。

不应该

orderGroup.HasOptional(og => og.UnpricedOrder)
              .WithOptionalPrincipal()

对于键映射,您可能最好更换      .Map(og => og.MapKey("UnpricedOrderId"));

    public virtual Order UnpricedOrder { get; set; }
    [ForeignKey("UnpricedOrder")]
    public virtual int UnpricedOrderId { get; set; }

答案 1 :(得分:0)

我们从未找到解决方法。最后,我们使用桥接表/模型来实现这一点。

所以我们有一个OrderOrderGroup表(希望我们的名字更简单),每行需要OrderIdOrderGroupId。然后,我们有第三列描述了这种关系。因此订单被从订单组中省略(因为它是未定价的),或者它属于订单组。

然后,

实体框架可以处理此问题并知道保存订单和订单组,然后保存OrderOrderGroup。