尝试将FK设置为​​null时,引用完整性约束违规

时间:2014-08-15 02:06:47

标签: c# entity-framework referential-integrity

我正在尝试更新EF6中的实体。我已经读过,如果我想更改一个ForeignKey属性,我必须确保导航属性是正确的,或者将其设置为null。

我已将set设置为null方法,但我仍然收到参照完整性约束异常:

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,所以我相信这不应该抛出。

enter image description here

任何想法?

修改

这是实体的更新方式:

public T CommitUpdate<T>(T obj) where T : class
    {
        _DbContext.Set<T>().Attach(obj);
        _DbContext.Entry(obj).State = EntityState.Modified;
        _DbContext.Commit();
        return obj;
    }

2 个答案:

答案 0 :(得分:9)

从我从评论中看到的,你正在解决这个问题:

  
    

我想更改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会先尝试在数据库中创建新的Contact,然后使用其PK来提供ContactId FK。

  • 创建空Contact实体,将其ID设置为现有联系人ID。然后,将此实体用作相关实体的“联系人”字段。然后,将Contact附加到具有 UnChanged 状态的上下文。

    有了这个,你会告诉EF这个联系人已经存在,不应该被跟踪,也不应该被改变,但它的ID将被用作你的父实体的FK。请注意,应将此联系人(未更改状态)附加到与其父级相同的上下文中。

答案 1 :(得分:-2)

我有类似的问题,你可以试试这个:

  1. Contact.ContactId设置为所需的值。
  2. 将联系人设置为new object()
  3. 希望这适合你。