Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

EntityFramework создает множество записей в бд

Пишу программу для учета поставщиков, и заказов у данных поставщиков с использованием Entity Framework Code First.
Одновременно с созданием заказа, создается новый поставщик с данным заказом, то есть в БД есть поставщик с заказом и поставщик без заказа, если создать ещё один заказ, то создастся ещё один поставщик с данным заказом.
Классы:
Поставщик
public class Contractor { public int ContractorId { get; set; } public string ContractorName { get; set; } public string ManagerName { get; set; } public string ContactPhone { get; set; } public string ContactEmail { get; set; } public ICollection Orders { get; set; } public override string ToString() { return ContractorName; } }
Заказ
public class Order { public int OrderId { get; set; } public virtual ICollection PositionsQty { get; set; } public decimal Sum { get; set; } public string InvoiceNumber { get; set; } public Byte[] InvoiceScan { get; set; } public Byte[] ClosingDocScan { get; set; } public DateTime OrderDate { get; set; } public DateTime DeliveryDate { get; set; } public int ContractorId { get; set; } public virtual Contractor Contractor { get; set; }
public override string ToString() { return "Счет №: " + InvoiceNumber + " от " + OrderDate.Day + "/" + OrderDate.Month + "/" + OrderDate.Year; } }
Создание Заказа
private void SaveBtn_Click(object sender, RoutedEventArgs e) { using (var db = new ContractorContext()) { Order order = new Order(); if(InvoiceNumberBox.Text != null) order.InvoiceNumber = InvoiceNumberBox.Text; order.DeliveryDate = DeliveryDatePick.SelectedDate ?? DateTime.Now; order.OrderDate = OrderDatePick.SelectedDate ?? DateTime.Now; if(InvoiceSumBox.Text != null) order.Sum = Decimal.Parse(InvoiceSumBox.Text.Replace('.',',')); order.Contractor = _contractor; order.ContractorId = _contractor.ContractorId; order.PositionsQty = new List(); foreach (PositionsQty item in OrderPositions.Items) { order.PositionsQty.Add(item); } if (_contractor.Orders != null) { _contractor.Orders.Add(order); } else { _contractor.Orders = new List {order}; } //db.Contractors.AddOrUpdate(_contractor); db.Orders.AddOrUpdate(order); db.SaveChanges(); this.Close(); } }
Объект _contractor передаётся из другой формы.
В чем ошибка?


Ответ

объекты order и _contractor находятся в разных экземплярах контекста ContractorContext. Чтобы не плодить дубли не заполняйте поле order.Contractor, вполне достаточно указать order.ContractorId

Комментариев нет:

Отправить комментарий