我很确定我已经在某个地方看到了这个问题的答案,但是因为我无法通过搜索SO或谷歌进行搜索,所以无论如何我都会再次询问...
在Entity Framework中,删除数据对象的唯一方法似乎是
MyEntityModel ent = new MyEntityModel();
ent.DeleteObject(theObjectToDelete);
ent.SaveChanges();
但是,这种方法需要首先加载对象,在这种情况下,首先要删除它。有没有办法删除仅引用其ID的业务对象?
如果使用Linq或Lambda表达式有更聪明的方法,那也没关系。但主要目的是避免加载数据只是为了删除它。
答案 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...
关键是如果其他用户在过渡期间更改了记录,则删除应该失败(不执行任何操作)。
有了这个,更好的问题陈述,使用实体框架时有两种可能的解决方案。
在Delete方法中,现有实例比较属性的预期值,如果它们相同则删除。在这种情况下,实体框架将负责编写包含属性值的DELETE语句。
编写一个接受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);
它对批量删除也很有用。