如何在不首先加载对象的情况下从Entity Framework模型中删除对象?

时间:2009-02-02 10:38:02

标签: asp.net-mvc entity-framework linq-to-entities

我很确定我已经在某个地方看到了这个问题的答案,但是因为我无法通过搜索SO或谷歌进行搜索,所以无论如何我都会再次询问...

在Entity Framework中,删除数据对象的唯一方法似乎是

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

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

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

7 个答案:

答案 0 :(得分: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函数采用可选的参数数组。

答案 1 :(得分:8)

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

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

答案 2 :(得分:4)

提前道歉,但我必须质疑你的目标。

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

DELETE FROM FOO
WHERE ID = 1234

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

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

关键是如果其他用户在过渡期间更改了记录,则删除应该失败(不执行任何操作)。

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

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

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

答案 3 :(得分:4)

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

关于Deleting without Fetching的博客文章

答案 4 :(得分:4)

您可以创建具有相同ID的对象并将其传递给删除 但如果你有复杂的关系,它对简单的对象有好处,你可能需要更多的东西

                var user = new User { ID = 15 };
                context.Entry(user).State = EntityState.Deleted;
                context.SaveChanges();

答案 5 :(得分: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等)。

如果你觉得有些奇特的话,也可以看一下here的泛型函数。

答案 6 :(得分:3)

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

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

它对批量删除也很有用。