LINQ to SQL:DataContext.SubmitChanges不会立即更新

时间:2011-01-14 03:44:44

标签: c# linq linq-to-sql datacontext

我有一个有趣的问题。

执行DataContext.SubmitChanges()以一种方式更新Count()但不在另一种方式中更新,请参阅下面代码中的注释。
(DC是DataContext)

  Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName);
  DataCompliance compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

  if (compliances.Count() == 0) // Insert if not exists
  {
    DC.DataCompliances.InsertOnSubmit(new DataCompliance {
      FKCompany = c.Id,
      FKComplianceCriteria = criteria.Id
    });
    DC.SubmitChanges();

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

    // At this point DC.DataCompliances.Count() has increased,
    // but compliances.Count() is still 0
    // When I refresh the page however, it will be 1
  }

为什么会这样?

我需要在插入一个后立即更新compliances。有没有人有解决方案?

2 个答案:

答案 0 :(得分:4)

将对象添加到数据上下文(并将其传播回数据库)并将其添加到您从数据库中检索的对象的关联实体集合之间存在差异。一旦检索到对象及其关联实体,对数据库中的数据进行更改将不会反映在检索到的对象中,因为不需要数据库。关键位是公司的SingleOrDefault() - 强制执行查询并分配检索到的数据。如果尚未急切加载,则枚举关联的实体将导致它们被加载。因此,即使在更新数据库之后,先前检索的对象也不会反映更新。但是,您可以将插入的对象添加到公司的数据合规集合中,然后执行更新,这将是您所期望的。请注意,我认为您仍需要分配您在支票中使用的关联实体。刷新页面也解决了问题,因为数据从数据库中被重新获取,更新了关联的实体集合以及数据上下文中的表。

Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName);
var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

if (compliances.Count() == 0) // Insert one if not exist yet
{
    c.DataCompliances.Add( new DataCompliance
    {
        ComplianceCriteria = criteria
    });
    DC.SubmitChanges();

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
}

原始(左侧为上下文)

如果您尝试分配关联的实体而不仅仅是其ID,该怎么办?我相信分配id实际上不会填充正在检查的关联实体,并且SubmitChanges仅将数据传播回DB,而不是实际使用关联实体的数据更新table元素。

var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);

if (compliances.Count() == 0) // Insert one if not exist yet
{
    DC.DataCompliances.InsertOnSubmit(new DataCompliance {
        FKCompany = c.Id,
        ComplianceCriteria = criteria
    });
    DC.SubmitChanges();

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id);
}

答案 1 :(得分:1)

c.DataCompliances.Where...更改为DC.DataCompliances.Where...

DC是数据上下文,c

的定义是什么