Linq to Entities вставляет несколько дочерних записей отношений для отношений многие ко многим, используя POCO - PullRequest
1 голос
/ 17 января 2012

У меня есть база данных, подобная ниже:

Order
===============
OrderID
Description
EmployeeID
...other fields


Product
===============
ProductID
...other fields


OrderProducts
===============
OrderID
ProductID


Employee
===============
EmployeeID
...other fields



Я использую Linq to Entities, и файл edmx был создан без таблицы OrderProducts, так как это просто объединяющая таблица . Таблица Products представляет собой список статических продуктов - мне не нужно вставлять строки в данный момент. В таблицу Order я могу успешно вставить строки, используя следующий код:

[Serializable]
public class MyOrderObject
{
   public int OrderID { get; set; }
   public string OrderDescription { get; set; }
   public int? EmployeeID { get; set; }
   public IEnumerable<MyProductObject> ProductsList { get; set; }
   ...other fields
}

[Serializable]
public class MyProductObject
{
   public int ProductID { get; set; }
   ...other fields
}


private static void AddNewOrder(MyOrderObject order)
{
   using (var context = DatabaseHelper.CreateContext())
   {
      var dbOrder = new Order
      {
         OrderID = order.OrderID,
         Description = order.OrderDescription,
         Employee = context.Employees.SingleOrDefault(x => x.EmployeeID == order.EmployeeID),
      }
      context.AddToOrders(dbOrder);
      context.SaveChanges();
   }
}

Как мне вставить в базу данных мой список записей о дочерних отношениях ?? Я пробовал:

List<int> ProductIDs = order.ProductsList.Select(x => x.ProductID).ToList();
//dbOrder.Products.Attach(context.Products.Where(x => ProductIDs.Contains(x.ProductID)));
//or dbOrder.Products = context.Products.Where(x => ProductIDs.Contains(x.ProductID));
//or dbOrder.Products = context.Products.Contains(ProductIDs);
//or foreach(var p in order.ProductsList)
//   {
//      context.AttachTo("Products", new Product { ProductID = p.ProductID });
//   }

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Вам необходимо изменить тип ProductsList на ICollection.И убедитесь, что это часть модели EDMX.

public class MyOrderObject
{
   public int OrderID { get; set; }
   public string OrderDescription { get; set; }
   public int? EmployeeID { get; set; }
   public ICollection<MyProductObject> ProductsList { get; set; }
   ...other fields
}

Затем вы можете добавить продукты

var products = context.Products.Where(/**/);
foreach(var p in products)
   order.ProductsList.Add(p);
1 голос
/ 23 января 2012

Нет необходимости менять тип объекта:

var dbOrder = new Order
{
   OrderID = order.OrderID,
   Description = order.OrderDescription,
   Employee = context.Employees.SingleOrDefault(x => x.EmployeeID == order.EmployeeID),
}

//this adds the relationship to the child without adding a new child record - perfect!
foreach(var p in order.ProductsList)
{
   dbOrder.Products.Add(p);
}

context.AddToOrders(dbOrder);
context.SaveChanges();
...