栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

实体框架.Remove()与.DeleteObject()

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实体框架.Remove()与.DeleteObject()

两种方法都可以“ 从数据库中删除项目 ”通常是不正确的。准确地说是这样的:

  • ObjectContext.DeleteObject(entity)
    将实体
    Deleted
    标记 上下文。(这
    EntityState
    Deleted
    后)。如果你打电话
    SaveChanges
    后EF发送SQL
    DELETE
    语句到数据库。如果没有违反数据库中的引用约束,则将删除该实体,否则将引发异常。

  • EntityCollection.Remove(childEntity)
    将parent和的关系
    childEntity``Deleted
    标记 。如果
    childEntity
    本身已从数据库中删除,那么调用时究竟发生什么
    SaveChanges
    取决于两者之间的关系类型:

    • 如果该关系是 可选的 ,即从数据库中的子级到父级引用的外键允许

      NULL
      值,则此外键将设置为null,并且如果您为调用
      SaveChanges
      NULL
      childEntity
      将被写入数据库(即两者都被删除)。使用SQL
      UPDATE
      语句会发生这种情况。没有
      DELETE
      语句发生。

    • 如果 需要 该关系(FK不允许

      NULL
      值)并且该关系 不确定 (这意味着外键不是孩子的(复合)主键的一部分),则必须将孩子添加到另一个父母中,或者您必须明确删除子项(
      DeleteObject
      然后删除)。如果您不执行任何这些操作,则会违反引用约束,并且在调用时EF会引发异常
      SaveChanges
      -臭名昭著的 _“ 该关系无法更改,因为一个或多个外键属性是不可为空的 ”_异常或类似。

    • 如果关系被 识别 (它不一定 需要 然后,因为主键的任何部分不能是

      NULL
      )EF将标记
      childEntity
      作为
      Deleted
      为好。如果调用,则会将
      SaveChanges
      SQL
      DELETE
      语句发送到数据库。如果没有违反数据库中的其他引用约束,则将删除该实体,否则将引发异常。

我实际上对您链接的MSDN页面上的 “ 备注”部分有些困惑,因为它说:“ 如果关系具有参照完整性约束,则在从属对象上调用Remove方法 会将
关系和从属对象都标记为删除。 ”。这对我来说似乎不准确,甚至是错误的,因为上述所有三种情况都具有“ 参照完整性约束
”,但仅在最后一种情况下,实际上删除了孩子。(除非它们与“ 从属对象 ”是指参与识别关系的对象,不过这将是一个不常见的术语。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405375.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号