onefootswill
onefootswill

Reputation: 4107

Entity Framework 4 - Duplicate Key Upon Update

I'm having trouble performing an update in the Entity Framework. I don't really understand the behaviour I am seeing.

I am using the AdventureWorks database.

The starting value for the StateProvince is Micronesia. If I change it to Maryland, the update is successful. However, if I then try to change it back to Micronesia, I get the following error:

"Cannot insert duplicate key row in object 'Sales.SalesTerritory' with unique index 'AK_SalesTerritory_Name'.\r\nThe statement has been terminated."

The DAL method in question is:

    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);
    }

Can anyone identify the correct way to do what I am attempting.

Upvotes: 0

Views: 368

Answers (1)

Ed Chapel
Ed Chapel

Reputation: 6952

This is occurring when you update the SalesTerritory.Name property:

 customer.SalesTerritory.Name = customerDetails.SalesTerritory;

The effect is to change the SalesTerritory entity, rather than the customer entity. I believe you want something more like:

 customer.SalesTerritoryID = customerDetails.SalesTerritoryID;

Upvotes: 1

Related Questions