问题
I am trying to update an entity in EF6. I have read that if I wish to change a ForeignKey property, I have to then ensure the Navigation Property is the correct one, or set it to null.
I have taken the set to null approach, but I still receive the Referential Integrity Constraint Exception:
A referential integrity constraint violation occurred: The property value(s) of 'Contact.idContact' on one end of a relationship do not match the property value(s) of 'Entity.id_EntityContactInfo' on the other end.
But you can see in the debugger, that Entity.Contact is null, so I believe this shouldn't be throwing.
Any Ideas?
EDIT
This is how the entity is updated:
public T CommitUpdate<T>(T obj) where T : class
{
_DbContext.Set<T>().Attach(obj);
_DbContext.Entry(obj).State = EntityState.Modified;
_DbContext.Commit();
return obj;
}
回答1:
From what I see from comments, you are solving this problem:
I want to change the FK scalar, but not add the current item into the database again
You should have mapping something like this one:
public class MyEntity {
...
public int ContactId { get; set; }
[ForeignKey("ContactId")]
public Contact Contact { get; set; }
...
}
As FK is declared as not-nullable, you have to set it.
Basically you have several options to do it:
Set
ContactId
to real ID in database, setContact
to nullIn this case, you will update FK with existing Contact in DB - hopefully the option you need.
Set
ContactId
to 0, and setContact
tonew Contact(..)
In this case, EF will try to create new
Contact
in DB first, and then will use its PK to feedContactId
FK.Create empty
Contact
entity, set its ID to existing contact ID. Then, use this entity as Contact field for your entity in question. Then, attach thatContact
to context with UnChanged state.Having this, you will say to EF that this Contact is already existing, should not be tracked and should not be changed, but its ID will be used as FK for your parent entity. Just take care that this Contact should be attached (in unchanged state) to the same context as its parent.
来源:https://stackoverflow.com/questions/25320296/referential-integrity-constraint-violation-when-attempting-to-set-a-fk-to-null