i'm using Entity Framework 4.0 and having a silly problem that i can't figure out.
I have two tables:
Entity Framework created the following two entities:
I'm using the following code to get the contact and update the contact type for that particular contact:
Contact contact = dbContext.Contacts.Single(c => c.Id == 12345); contact.ContactType.Id = 3;
Throws the following exception:
The property 'Id' is part of the object's key information and cannot be modified.
It looks so simple! I don't get it!
"The property 'Id' is part of the object's key information and cannot be modified."
{property}' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key, first delete the dependent and invoke 'SaveChanges', and then associate the dependent with the new principal.
You cannot update a primary key, but that is not a limitation of entity framework, but a very fundamental rule of database development. A primary key is assigned once to a row in a table and makes this row unique. Maybe you can update the key in some ways, but this violates definitely the definition of a primary key.
This problem happens because you are referencing the same object more than once. This is not a limitation of EF, but rather a safety feature to ensure you are not inserting the same object with two different IDs. So to achieve what you are trying to do, is simply create a new object and add the newly created object to the database.
** This issue often happens inside loops. If you are using a while or foreach loop, make sure to have the New Created Object INSIDE the loop body.
try this:
Contact contact = dbContext.Contacts.Single(c => c.contactTypeId == 1234); contact.contactTypeId = 4; dbContext.AddObject(contact); dbContext.SaveChanges();
The entity that was created by the framework doesn't have a contact.ContactTypeId property. It automatically removed it and created the ContactType association inside the Contact entity.
The way to get it to work, as you suggested, is to create a ContactType object by querying the database and assigning it to contact.ContactType. For example:
Contact contact = dbContext.Contacts.Single(c => c.Id == 12345); ContactType contactType = dbContext.ContactType.Single(c => c.Id == 3); contact.ContactType = contactType;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With