#c_sharp #net #entity_framework
Пишу программу для учета поставщиков, и заказов у данных поставщиков с использованием 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 ICollectionOrders { 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 передаётся из другой формы. В чем ошибка?
Ответы
Ответ 1
объекты order и _contractor находятся в разных экземплярах контекста ContractorContext. Чтобы не плодить дубли не заполняйте поле order.Contractor, вполне достаточно указать order.ContractorId.Ответ 2
А у Вас в структуре базы для таблицы Contractor первичный ключ создался как ContractorId? Возможно Вам поможет явное указание ключей для Entity Framevork, попробуйте так. Для поставщика: public class Contractor { [Key] public int ContractorId { get; set; } ... } Для заказа: public class Order { [Key] public int OrderId { get; set; } ... [ForeignKey("Contractor ")] public int ContractorId { get; set; } public virtual Contractor Contractor { get; set; } ... }
Комментариев нет:
Отправить комментарий