Entity Framework 4 - дубликат ключа после обновления - PullRequest
0 голосов
/ 04 января 2012

У меня проблемы с выполнением обновления в Entity Framework.Я не совсем понимаю поведение, которое вижу.

Я использую базу данных AdventureWorks.

Начальное значение для StateProvince равно Micronesia.Если я изменю его на Maryland, обновление пройдет успешно.Однако, если я затем пытаюсь изменить его обратно на Micronesia, я получаю следующую ошибку:

"Невозможно вставить строку с повторяющимся ключом в объект 'Sales.SalesTerritory' с уникальным индексом 'AK_SalesTerritory_Name'.\ r \ nОпределение было прекращено. "

Рассматриваемый метод DAL:

    public static void UpdateCustomer(CustomerDetails customerDetails)
    {
        AWEntities context = Common.GetContext();
        var customerQuery = from c in context.Individuals
                                .Include("Contact")
                                .Include("Customer.CustomerAddresses.Address.StateProvince.SalesTerritory")
                                //.Include("Customer.SalesTerritory.StateProvinces")
                                .Where(id => id.CustomerID == customerDetails.CustomerId)
                            select c;
        var individual = customerQuery.ToList().ElementAt(0);

        Contact contact = individual.Contact;
        contact.LastName = customerDetails.LastName;
        contact.MiddleName = customerDetails.MiddleName;
        contact.FirstName = customerDetails.FirstName;
        contact.EmailAddress = customerDetails.EmailAddress;
        contact.Phone = customerDetails.Phone;
        contact.Title = customerDetails.Title;

        AWModel.Customer customer = individual.Customer;
        customer.CustomerID = customerDetails.CustomerId;
        customer.SalesTerritory.Name = customerDetails.SalesTerritory;

        Address address = individual.Customer.CustomerAddresses.ElementAt(0).Address;
        address.AddressLine1 = customerDetails.AddressLine1;
        address.AddressLine2 = customerDetails.AddressLine2;
        address.City = customerDetails.City;
        address.PostalCode = customerDetails.PostalCode;
        address.StateProvinceID = customerDetails.SalesProvinceId;

        context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    }

Может ли кто-нибудь определить правильный способ сделать то, что я пытаюсь сделать.

1 Ответ

1 голос
/ 04 января 2012

Это происходит при обновлении свойства SalesTerritory.Name:

 customer.SalesTerritory.Name = customerDetails.SalesTerritory;

Эффект заключается в изменении сущности SalesTerritory, а не сущности customer. Я считаю, что вы хотите что-то еще, как:

 customer.SalesTerritoryID = customerDetails.SalesTerritoryID;
...