尝试将FK设置为null时,参照完整性约束违规
我正在尝试更新EF6中的实体。 我已经读过,如果我想更改一个ForeignKey属性,我必须确保导航属性是正确的,或者将其设置为null。
我已将set设置为null方法,但我仍然收到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.
但是你可以在调试器中看到Entity.Contact为null,所以我相信这不应该抛出。
有任何想法吗?
编辑
这是实体的更新方式:
public T CommitUpdate(T obj) where T : class { _DbContext.Set().Attach(obj); _DbContext.Entry(obj).State = EntityState.Modified; _DbContext.Commit(); return obj; }
从我从评论中看到的,你正在解决这个问题:
我想更改FK标量,但不能再次将当前项添加到数据库中
你应该有这样的映射:
public class MyEntity { ... public int ContactId { get; set; } [ForeignKey("ContactId")] public Contact Contact { get; set; } ... }
由于FK被声明为不可空,您必须设置它。
基本上你有几个选择:
-
将
ContactId
设置为数据库中的实际ID,将Contact
设置为null在这种情况下,您将使用DB中的现有联系人更新FK – 希望您需要的选项。
-
将
ContactId
设置为0,并将Contact
设置为new Contact(..)
在这种情况下,EF将首先尝试在DB中创建新的
Contact
,然后将使用其PK来提供ContactId
FK。 -
创建空的
Contact
实体,将其ID设置为现有联系人ID。 然后,将此实体用作相关实体的“联系人”字段。 然后,将该Contact
附加到具有UnChanged状态的上下文。有了这个,你会告诉EF这个联系人已经存在,不应该被跟踪,也不应该被改变,但它的ID将被用作你的父实体的FK。 请注意,应将此联系人(未更改状态)附加到与其父级相同的上下文中。
我有类似的问题,你可以试试这个:
- 将
Contact.ContactId
设置为所需的值。 - 将联系人设置为
new object()
。
希望这对你有用。