繁体   English   中英

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

[英]LINQ to SQL:DataContext.SubmitChanges not updating immediately

我有一个有趣的问题。

进行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后,我需要立即更新compliances 有没有人有办法解决吗?

将对象添加到数据上下文(并将其传播回数据库)和将其添加到从数据库中检索到的对象的关联实体集合之间是有区别的。 一旦检索到对象及其关联的实体,对数据库中数据的更改将不会反映在检索到的对象中,因为不需要数据库。 关键位是公司上的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只是将数据传播回数据库,而实际上并未使用关联实体的数据更新表元素。

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);
}

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

DC是数据上下文, c的定义是什么

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM