在实体框架6中有多种添加/删除实体的方式,例如添加实体,我们可以使用: -
b.Students.Add(student);
db.SaveChanges();
OR
db.Entry(student).State = EntityState.Added;
db.SaveChanges();
和删除对象时类似: -
db.Entry(studentToDelete).State = EntityState.Deleted;
db.SaveChanges();
OR
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();
}
两者都添加了部门和员工。那么请你这么做吗?
答案 0 :(得分:1)
来自Lerman&米勒的DbContext书(第80页):
致电
DbSet.Add
并将State
设置为Added
,两者完全相同。
这是:
如果上下文没有跟踪实体,它将开始被上下文跟踪
Added
州。DbSet.Add
。State
和将Added
设置为Added
都是图表操作 - 意味着没有被上下文跟踪并且可以访问的任何其他实体 来自根实体的也将标记为Added
。如果已经跟踪了实体(根实体 - 我的addiditon) 根据上下文,它将被移动到DbContext
状态。
请注意,在您提到的问题中未正确回答这个问题。这本书是用EF 4.3编写的,并且在引入DbSet.Remove()
时它没有提到自EF 4.1以来的任何重大变化。
将实体的状态设置为已删除(通过Entry(entity).State
或将Deleted
设置为Added
)不是图形操作。它只影响实体的状态,而不影响其对象图中的实体。
后者适用于除Deleted
之外的任何实体状态。
此规则的一个例外是在数据库和EF模型中配置了级联删除。在与隐藏联结表的多对多关联中,级联删除是默认值,因此当根实体标记为删除时(通过将其状态设置为DbSet
或删除它),始终会删除联结记录来自A
)。
例如,让B
和AB
具有多对多关联。联结表A
仅在数据库中,而不在类模型中。如果您从数据库中提取Include()
(没有B
- 其A
)并将其删除,则会删除AB
及其B
的al A
记录,但没有B
被删除。
当在一对多关联中时,级联删除被配置为“很多”'当' 1'实体被删除。如果A
和B
具有一对多关联,则删除var json = { "data": [["2015-07-22",125677000000.0], ["2015-04-28",129006000000.0], ["2015-01-28",123328000000.0], ["2014-10-27",111547000000.0], ["2014-07-23",120940000000.0], ["2014-04-24",120178999999.99998], ["2014-01-28",129684000000.0], ["2013-10-30",123549000000.0], ["2013-07-24",123354000000.00002], ["2013-04-24",135490000000.0], ["2013-01-24",127346000000.0], ["2012-10-31",118210000000.0]]
};
var sums = {};
_.each(json.data, function(arr) {
var index = arr[0].split('-')[0];
if (typeof(sums[index]) !== 'undefined') {
sums[index] += arr[1];
} else {
sums[index] = arr[1];
} });
也会删除其{{1}}。