39

我很确定我已经在某处看到了这个问题的答案,但是由于我在 SO 或谷歌上进行了几次搜索都找不到它,所以我还是再问一次......

在实体框架中,删除数据对象的唯一方法似乎是

MyEntityModel ent = new MyEntityModel();
ent.DeleteObject(theObjectToDelete);
ent.SaveChanges();

但是,这种方法需要先将对象加载到控制器,在这种情况下,首先要删除它。有没有办法删除仅引用其 ID 的业务对象?

如果有更聪明的方式使用 Linq 或 Lambda 表达式,那也很好。但是,主要目标是避免加载数据只是为了删除它。

4

7 回答 7

19

值得一提的是,Entity Framework 同时支持 Linq to Entities 和 Entity SQL。如果您发现自己想要进行可能影响许多记录的删除或更新,您可以使用ExecuteNonQuery.

在 Entity SQL 中,这可能看起来像

   Using db As New HelloEfEntities

        Dim qStr = "Delete " & _
                  "FROM Employee"
        db.ExecuteStoreCommand(qStr)
        db.SaveChanges()
    End Using

在这个例子中,db是我的ObjectContext. 另请注意,该ExecuteStoreCommand函数采用可选的参数数组。

于 2010-06-13T22:18:04.547 回答
8

我找到了这篇文章,其中指出确实没有更好的方法来删除记录。给出的解释是该记录唯一的所有外键、关系等也被删除,因此 EF 需要具有有关该记录的正确信息。我对为什么不来回加载数据就无法实现这一点感到困惑,但由于它不会经常发生,我决定(现在)我不会打扰。

如果您确实有解决此问题的方法,请随时告诉我=)

于 2009-02-02T11:31:39.637 回答
4

提前道歉,但我不得不质疑你的目标。

如果您删除一个对象而没有阅读它,那么您无法知道在您确认要删除该对象和实际删除之间是否有其他用户更改了该对象。在“普通旧 SQL”中,这就像做:

DELETE FROM FOO
WHERE ID = 1234

当然,大多数人实际上并没有这样做。相反,他们会做类似的事情:

DELETE FROM FOO
WHERE ID = 1234
  AND NAME = ?ExpectedName AND...

关键是如果另一个用户在此期间更改了记录,则删除应该失败(什么也不做)。

有了这个更好的问题陈述,使用实体框架时有两种可能的解决方案。

  1. 在您的 Delete 方法中,现有实例,比较属性的预期值,如果它们相同则删除。在这种情况下,实体框架将负责编写包含属性值的 DELETE 语句。

  2. 编写一个接受 IDE 和其他属性值的存储过程,然后执行它。

于 2009-02-02T14:02:48.523 回答
4

有一种方法可以通过重新计算实体的 EntityKey 来欺骗加载实体。它看起来有点像 hack,但可能是在 EF 中执行此操作的唯一方法。

关于删除而不获取的博客文章

于 2009-02-11T11:44:00.437 回答
4

您可以创建一个具有相同 id 的对象并将其传递给删除,但如果您有复杂的关系,您可能需要更多的关系,它对简单对象很有用

                var user = new User { ID = 15 };
                context.Entry(user).State = EntityState.Deleted;
                context.SaveChanges();
于 2016-06-14T04:22:16.130 回答
3
var toDelete = new MyEntityModel{
    GUID = guid,
    //or ID = id, depending on the key
    };
Db.MyEntityModels.Attach(toDelete);
Db.MyEntityModels.DeleteObject(toDelete);
Db.SaveChanges();

如果您的键包含多个列,您需要提供所有值(例如 GUID、columnX、columnY 等)。

如果您喜欢花哨的东西,还可以在这里查看通用功能。

于 2013-05-08T02:32:14.897 回答
2

使用 Entity Framework 5 有Entity Framework Extended Library。在 NuGet 上可用。然后你可以写这样的东西:

context.Users.Delete(u => u.Id == id);

它对于批量删除也很有用。

于 2013-07-23T07:07:59.473 回答