Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ef code first 为什么实体框架在将导航属性设置为null时不删除记录_Ef Code First_Code First_One To One - Fatal编程技术网

Ef code first 为什么实体框架在将导航属性设置为null时不删除记录

Ef code first 为什么实体框架在将导航属性设置为null时不删除记录,ef-code-first,code-first,one-to-one,Ef Code First,Code First,One To One,我是EF代码的新手,有一些问题 这是我的模型 我想要的是,如果我编写以下代码: user.Address = null; 应该删除相关地址(数据库中的记录),但不删除!它只删除用户表中的外键。此外,当我分配新地址时: user.Address = new Address() { ... }; 它是在数据库中创建的第二条记录,为什么 我想: 如果将null赋值给用户地址,则应删除数据库记录 如果将一个新的地址对象分配给user.Address,它应该用新的记录数据替换现有的记录数据 我怎

我是EF代码的新手,有一些问题

这是我的模型
我想要的是,如果我编写以下代码:

user.Address = null; 
应该删除相关地址(数据库中的记录),但不删除!它只删除用户表中的外键。此外,当我分配新地址时:

user.Address = new Address() { ... }; 
它是在数据库中创建的第二条记录,为什么

我想:

  • 如果将null赋值给
    用户地址
    ,则应删除数据库记录

  • 如果将一个新的地址对象分配给
    user.Address
    ,它应该用新的记录数据替换现有的记录数据


  • 我怎样才能解决这个问题

    如果需要删除实体,则需要将其标记为已删除。将导航属性设置为null不会删除相关实体。请注意,可能有许多导航属性(不同的实体)指向相关实体,它们在您描述的场景中都会受到影响。
    因为您创建了一个新地址,所以创建了一个新实体。然后将导航属性设置为新创建的属性,这将打破旧关系并创建新关系。由于您创建的实体不在数据库中,因此将添加该实体。您也没有删除旧实体,因此它没有从数据库中删除。如果只想更改实体的属性值,只需将属性设置为新值并调用SaveChanges。这将更新数据库中的数据

    谢谢pawel,你是对的,但我想进一步缩小我的模型范围。用户和地址应该保持一对一的关系,在这种关系中,地址离不开用户。所以,当user.Address设置为NULL时,地址必须有可能被删除。此外,在删除关联用户(级联)时,还应删除地址。你知道我如何认识到这一点吗?如果导航属性设置为null,你可能会覆盖SaveChanges()以将相关实体标记为已删除。如果删除了相应的用户,则只需设置级联删除即可删除地址实体
    user.Address = new Address() { ... };