Страницы

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

понедельник, 23 декабря 2019 г.

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

#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 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 передаётся из другой формы.

В чем ошибка?
    


Ответы

Ответ 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; } ... }

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

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