- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 theState
toAdded
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. BothDbSet.Add
and setting theState
toAdded
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 asAdded
. If the entity (the root entity - my addiditon) is already tracked by the context, it will be moved to theAdded
state.
请注意,您所指问题的回答不正确。这本书是为 EF 4.3 编写的,它没有提到自 EF 4.1 引入 DbContext
以来的任何重大变化。
将实体的状态设置为已删除(通过 DbSet.Remove()
或通过将 Entry(entity).State
设置为 Deleted
)不是图形操作。它只影响实体的状态,而不影响其对象图中的实体。
后者适用于除Added
之外的任何实体状态。
此规则的一个异常(exception)是在数据库和 EF 模型中都配置了级联删除。在与隐藏连接表的多对多关联中,级联删除是默认设置,因此当根实体被标记为删除时(通过将其状态设置为 Deleted
或通过将其从 DbSet
中删除)。
例如,让A
和B
有一个多对多的关联。联结表 AB
仅在数据库中,不在类模型中。如果您从数据库中获取一个 A
(没有 Include()
-ing 它的 B
)并删除它,A
被删除,它的所有 AB
记录,但没有 B
被删除。
在配置一对多关联级联删除时,当删除“1”个实体时,“多个”实体将被删除。如果 A
和 B
具有一对多关联,删除 A
也会删除它的 B
.
关于c# - DbSet.Add & DbSet.Remove 与使用 EntityState.Added & EntityState.Deleted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31599508/
I have a question about adding files in git. I have found multiple stackoverflow questions about
我是 visual studio 的新手,来自 Delphi。 我有一个充满 .cs 文件的目录树(根是\Common)。 我还有一个充满应用程序的目录树(根目录是\Applications) 最后,
这个问题在这里已经有了答案: Array's lookup time complexity vs. how it is stored (4 个答案) Time complexity for java
谁能告诉我这两者有什么区别: ALTER TABLE x1 ADD INDEX(a); ALTER TABLE x1 ADD INDEX(b); 和 ALTER TABLE x1 ADD INDEX(
为什么有时我们使用 getChildren() add() 而其他时候我们直接使用 add() es: https://docs.oracle.com/javafx/2/get_started/for
如何使用 bootstrap css 在输入下方添加跨度?我需要做这样的事情: 最佳答案 是这样的吗? http://jsfiddle.net/swm53ran/205/ 您可以使用纯 CSS 来实现
问题 np.add(X, 2*Y, out=X) 比 np.add(X, Y, out=X); np.add(X, Y, out=X).使用 np.add(X, Y, out=X); 是一种实际做法吗
当我跑 git add --intent-to-add .所有未跟踪的文件将其状态从“未跟踪的文件”( git status -s 显示 ?? )更改为“未暂存以进行提交的更改”( git statu
我不知道 .add 之间有什么区别和 .sink.add ? 例子: StreamController myStreamController = StreamController(); stream
getContentPane().add() 和 add() 的意思一样吗? public class TestFrame extends JFrame{ public TestFrame()
git add . 和 git add * 会完成完全相同的事情吗? 最佳答案 不,不会。 * 是一个 glob 模式,不会匹配以 开头的文件。 例如,假设这是当前目录,我有 2 个新文件要添加 fo
git的分支与合并的两种方法 git add -A和 git add . git add -u在功能上看似很相近,但还是存在一点差别 git add . :他会
git add [--all | -A] 之间有什么区别?和 git add . ? 最佳答案 此答案仅适用于 Git 版本 1.x。对于 Git 版本 2.x,请参阅其他答案。 总结: git ad
我刚刚安装了最新的 Wix v3.7。我创建了一个 VS 2010“Excel 2010 加载项”项目,并在同一个解决方案中创建了一个 Wix“安装项目”。 问题是,当我尝试从 Wix 项目中引用 A
YUI.add 和 YUI().add 有什么区别? 最佳答案 在第一种情况下,您要注册一个模块可以加载到 YUI 沙箱中,在第二种情况下,您要构建一个沙箱,然后进行注册(这是一种非常不典型的用法)。
测试代码时,任何输入到列表中的值在按下“enter”后都会消失。 我对编程和网络开发非常陌生。请具体一点,以便我理解。 function addItem(){ var item = documen
我正在浏览 python 的 dis 包。我尝试了代码以查看它是如何工作的 >>> def get(): ... x=4 ... y=x+3 ............ this lin
我已经对我的文件夹进行了版本控制 git init git add . git commit -m 'Initial commit' 我应该怎么做 git add 对于我在 .? 中创建的每个新文件
当我执行 $ git add * 时,有时我意识到 git 不会将已删除的文件添加到舞台上,如果删除或添加它,我需要手动指示,但我想不通找出 $ git add --all 有什么区别。因此,如果星号
这个问题在这里已经有了答案: Difference between "git add -A" and "git add ." (12 个答案) 关闭 6 年前。 目前,当我想提交并将内容推送到远程
我是一名优秀的程序员,十分优秀!