gpt4 book ai didi

c# - DbSet.Add & DbSet.Remove 与使用 EntityState.Added & EntityState.Deleted

转载 作者:行者123 更新时间:2023-11-30 12:43:25 25 4
gpt4 key购买 nike

Entity Framework 6中有多种添加/删除实体的方法,例如添加实体,我们可以使用:-

b.Students.Add(student);
db.SaveChanges();

db.Entry(student).State = EntityState.Added;
db.SaveChanges();

和删除对象时类似:-

db.Entry(studentToDelete).State = EntityState.Deleted;
db.SaveChanges();

db.Remove(StudentToDelete)
db.SaveChanges();

我没有找到太多讨论差异的资源,而且大多数在线教程都提到这两种方法,就好像它们是一样的。但我看过一篇文章的回复link是使用 dbset.Add 将实体及其所有相关实体/集合的状态设置为已添加,而使用 EntityState.Added 也会将所有相关实体/集合添加到上下文中,但将它们保留为未修改,同样适用于 dbset.Remove & EntityState.Deleted

那么这些差异是否正确?

编辑

据我所知,图形操作意味着父项和子项都被删除/添加,如果父项被标记为删除或添加。所以我做了这两个测试:-

using (var db = new TestContext())
{
var a = new Department { DepartmentName = "Shipping" };
var b = new Employee { FirstName = "Bob", LastName = "Dodds", Department = a };
db.Entry(b).State = EntityState.Added;
db.SaveChanges();
}



using (var db = new TestContext())
{
var a2 = new Department { DepartmentName = "Production" };
var b2 = new Employee { FirstName = "Sarah", LastName = "Gomez", Department = a2 };
db.Employees.Add(b2);
db.SaveChanges();
}

两者都添加了部门和员工。那么你能就此提出建议吗?

最佳答案

来自 Lerman & Miller 的 DbContext 书(第 80 页):

Calling DbSet.Add and setting the State to Added both achieve exactly the same thing.

这是:

If the entity is not tracked by the context, it will start being tracked by the context in the Added state. Both DbSet.Add and setting the State to Added are graph operations— meaning that any other entities that are not being tracked by the context and are reachable from the root entity will also be marked as Added. If the entity (the root entity - my addiditon) is already tracked by the context, it will be moved to the Added state.

请注意,您所指问题的回答不正确。这本书是为 EF 4.3 编写的,它没有提到自 EF 4.1 引入 DbContext 以来的任何重大变化。

将实体的状态设置为已删除(通过 DbSet.Remove() 或通过将 Entry(entity).State 设置为 Deleted)不是图形操作。它只影响实体的状态,而不影响其对象图中的实体。

后者适用于除Added 之外的任何实体状态。

此规则的一个异常(exception)是在数据库和 EF 模型中都配置了级联删除。在与隐藏连接表的多对多关联中,级联删除是默认设置,因此当根实体被标记为删除时(通过将其状态设置为 Deleted 或通过将其从 DbSet 中删除)。

例如,让AB 有一个多对多的关联。联结表 AB 仅在数据库中,不在类模型中。如果您从数据库中获取一个 A(没有 Include()-ing 它的 B)并删除它,A 被删除,它的所有 AB 记录,但没有 B 被删除

在配置一对多关联级联删除时,当删除“1”个实体时,“多个”实体将被删除。如果 AB 具有一对多关联,删除 A 也会删除它的 B .

关于c# - DbSet.Add & DbSet.Remove 与使用 EntityState.Added & EntityState.Deleted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31599508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com