2014-12-17 3 views
0

Я получаю следующую ошибку при попытке вставить объект в дочернюю коллекцию после того, как модельное связующее создало модель, детей и внуков, а затем с помощью контекста .SaveChanges() ;Entity Framework 6 имеет множественность 1 или 0..1

Нарушение множественности. Роль «OrderDetail_OrderDetailPricelistProductOptions_Source» отношения «PPLib.Models.OrderDetail_OrderDetailPricelistProductOptions» имеет множественность 1 или 0..1.

Мои модели следующие (удаленные свойства для краткости);

public class Order 
{ 
    public int OrderId { get; set; } 

    public virtual List<OrderDetail> OrderDetails { get; set; } 
} 

public class OrderDetail 
{ 
    public int OrderDetailId { get; set; } 

    public int OrderId { get; set; } 

    public int ProductId { get; set; } 
    public virtual Product Product { get; set; } //FK NAV 

    public int? PricelistProductId { get; set; } // if a subscriber order ...has the ProductId from a PriceList. 

    private decimal _Price = 0; 
    public decimal Price { get { return _Price; } set { _Price = value; } } 

    private int _Quantity = 1; 
    public int Quantity { get { return _Quantity; } set { _Quantity = value; } } 

    public virtual List<OrderDetailPricelistProductOption> OrderDetailPricelistProductOptions { get; set; } 

} 

public class OrderDetailPricelistProductOption 
{ 

    public int OrderDetailPricelistProductOptionId { get; set; } 

    public int OrderDetailId { get; set; } 

    public virtual List<OrderDetailPricelistProductOptionsDetail> OrderDetailPricelistProductOptionsDetails { get; set; } 
} 

public class OrderDetailPricelistProductOptionsDetail 
{ 

    public int OrderDetailPricelistProductOptionsDetailId { get; set; } 

    public int OrderDetailPricelistProductOptionId { get; set; } 

    public string Name { get; set; } 

} 

Чтобы яснее:

Если я представить совершенно новый порядок, со списком OrderDetails, его список OrderDetailPricelistProductOptions и его список OrderDetailPricelistProductOptionsDetails, модель связующий делают свою работу, и я не получаю никакой ошибки делать:

db.Orders.Add(order); 
db.SaveChanges(); 

Если я подам Редактировать с и существующий порядок и новый список OrderDetails, его список OrderDetailPricelistProductOptions и его список OrderDetailPricelistProductOptionsDetails, я получаю заказ от D контекст B, а затем объединить ORDERDETAILS из модели представления, используя:

order.OrderDetails.AddRange(pricelistProductVM.Order.OrderDetails); 

и я не получаю никакой ошибки делает:

db.Entry(order).State = EntityState.Modified; 
db.SaveChanges(); 

У меня есть особое положение, в котором я должен создать экземпляр нового OrderDetail под названием autoFillOd, и введите свои значения из одного из существующих OrderDetails, собранных в Binding Model. Меняю его количество значение, а затем добавить его в коллекцию OrderDetails в ViewModel, например, так:

pricelistProductVM.Order.OrderDetails.Add(autoFillOd); 

Когда я db.SaveChanges(), я получаю сообщение об ошибке.

Вы заметите, что ошибка на ребенка из OrderDetails: OrderDetail_OrderDetailPricelistProductOptions_Source

Почему я не могу добавить OrderDetail динамически в коллекции OrderDetails? Все OrderDetails являются новыми (для вставки), поэтому значения между копиями одинаковы, за исключением свойства Quantity, которое не должно быть проблемой.

Действие контроллера заключается в следующем:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Add(pricelistProductVM pricelistProductVM) 
    { 
     OrderLogic ol = new OrderLogic(); 

     //Auth is running on execute 

     int userId = WebSecurity.CurrentUserId; 

     int websiteId = (int)Session["websiteId"]; 

     int? id = null; // mediaId 

     int productId = pricelistProductVM.Product.ProductId; 

     int? eventId = pricelistProductVM.eventId; 

     string err = ""; 

     if (productId > 0) 
     { 
      //Set Pricelist 
      Pricelist pricelist = ol.setPricelist(websiteId, id, eventId); 

      if (pricelist.PricelistId != 0) 
      { 
       //get the pricelistproduct from the pricelist 
       PricelistProduct pp = await (from ppx in db.PricelistProducts 
              where ppx.ProductId == productId 
              && ppx.PricelistId == pricelist.PricelistId 
              && ppx.isAvailable == true 
              && ppx.DiscontinuedDate == null 
              && ppx.Product.isAvailable == true 
              && ppx.Product.DiscontinuedDate == null 
              select ppx).SingleOrDefaultAsync(); 
       if (pp != null) 
       { 
        Order order = new Order(); 

        //set some default values for the Order entity 
        if (pricelistProductVM.Order.OrderId == 0) 
        { 
         pricelistProductVM.Order.WebsiteId = websiteId; 
         pricelistProductVM.Order.UserId = userId; 
         pricelistProductVM.Order.EventId = eventId; 
         pricelistProductVM.Order.StartedDate = DateTime.UtcNow; 
         order = pricelistProductVM.Order; 
        } 
        else 
        { 
         order = await db.Orders.FindAsync(pricelistProductVM.Order.OrderId); 
        } 


        //set some default values for the OrderDetails entity 
        pricelistProductVM.Order.OrderDetails.First().InjectFrom(pp); 
        pricelistProductVM.Order.OrderDetails.First().IsPackage = false; 


        //determine if this product should be automatically added to any packages in the order 
        OrderDetail autoFillOd = ol.packageCheck(ref pp, ref pricelistProductVM, ref order, websiteId, db); 
        if (autoFillOd != null) 
        { 
         if (autoFillOd.Quantity > 0) 
         { 
          //This is where the OrderDetail that causes a problem is added 
          pricelistProductVM.Order.OrderDetails.Add(autoFillOd); 
         } 
        } 

        if (pricelistProductVM.Order.OrderId == 0) 
        { 


         db.Orders.Add(order); 
        } 
        else 
        { 
         order.OrderDetails.AddRange(pricelistProductVM.Order.OrderDetails); 
         db.Entry(order).State = EntityState.Modified; 
        } 

        db.SaveChanges(); 


       } 
       else 
       { 
        //return error 
        err = "The product was not found in the available pricelist. Please reload your browser and make sure you are signed-in."; 
       } 
      } 

     } 
     else 
     { 
      //return error 
      err = "A productId was not passed so no product could not be found. Please reload your browser and make sure you are signed-in."; 
     } 


     if (err == "") 
     { 
      ViewBag.data = JsonConvert.SerializeObject(new { Success = 1, Msg = "The product was successfully added to your cart." }); 
     } 
     else 
     { 
      ViewBag.data = JsonConvert.SerializeObject(new { Success = 0, Msg = err }); 
     } 

     return View(); 
    } 

Я ценю помощь!

+0

у вас есть fluentapi конфигурации для этой модели? – Mario

ответ

0

Я думаю OrderDetailPricelistProductOption.OrderDetailId не может быть один -> он должен быть список, потому что он может появиться во многих OrderDetails ...

Смежные вопросы