DbSet.Add& DbSet.Remove使用EntityState.Added& EntityState.Deleted

时间:2015-07-23 23:03:48

标签: c# asp.net-mvc entity-framework entity-framework-6

在实体框架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();
}

两者都添加了部门和员工。那么请你这么做吗?

1 个答案:

答案 0 :(得分:1)

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

  

致电DbSet.Add并将State设置为Added,两者完全相同。

这是:

  

如果上下文没有跟踪实体,它将开始被上下文跟踪   Added州。DbSet.AddState和将Added设置为Added都是图表操作 -   意味着没有被上下文跟踪并且可以访问的任何其他实体   来自根实体的也将标记为Added。如果已经跟踪了实体(根实体 - 我的addiditon)   根据上下文,它将被移动到DbContext状态。

请注意,在您提到的问题中未正确回答这个问题。这本书是用EF 4.3编写的,并且在引入DbSet.Remove()时它没有提到自EF 4.1以来的任何重大变化。

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

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

此规则的一个例外是在数据库和EF模型中配置了级联删除。在与隐藏联结表的多对多关联中,级联删除是默认值,因此当根实体标记为删除时(通过将其状态设置为DbSet或删除它),始终会删除联结记录来自A)。

例如,让BAB具有多对多关联。联结表A仅在数据库中,而不在类模型中。如果您从数据库中提取Include()(没有B - 其A)并将其删除,则会删除AB及其B的al A记录,但没有B被删除

当在一对多关联中时,级联删除被配置为“很多”'当' 1'实体被删除。如果AB具有一对多关联,则删除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}}。