【问题标题】:Object from LINQ-to-SQL before SubmitChangesSubmitChanges 之前来自 LINQ-to-SQL 的对象
【发布时间】:2011-01-18 20:06:26
【问题描述】:

我最初将此作为对this question 的回复发布,但我意识到我应该问一个新的。这似乎表明我应该能够做到以下几点:

int count = Db.Countries.Count();
Country newCountry = new Country{Name = "France"};
Db.Countries.InsertOnSubmit(c);
Country getCountry = Db.Countries.FirstOrDefault(x => x.Name == "France");
count = Db.Countries.Count();
Db.Countries.DeleteOnSubmit(c);
count = Db.Countries.Count();

但是,在空表上,count 在调试器中单步执行时始终保持为0,而在执行后getCountrynull

我错过了什么?

【问题讨论】:

  • 这有点离题了,但是那些 Count() 操作非常繁重吗?我知道它使数据库查询来计算行数。也许将其转换为列表,然后在 Count() 上取 Count 更快?
  • Count() 比转换为列表然后计算其中的对象要快。 select count(1) from Country 总是比 select x, y, z from Country 快,然后计算结果。

标签: .net linq-to-sql


【解决方案1】:

LINQ-to-SQL 位于数据库中的数据和本地保存的对象之间。此时,您尚未将更改提交到数据库 (Db.SubmitChanges()) - 它们仅存在于本地。

Db.Countries.Count() 在数据库中执行(即select COUNT(1) from Countries) - 所以答案是 0。

尝试将本地增量与数据库世界结合起来会非常困难(在一般情况下),所以简而言之:不要那样做。它不会起作用。

【讨论】:

  • 好吧,我明白了,我想更好的措辞方式是,为什么 MyObject newObject = db.MyObjects.Where(o => o.Id == 1).SingleOrDefault ();从最初的问题可以,但 Count() 不是?
  • @enashnash 实际上你没有在原始问题中进行 Id 匹配,但它得到了......更棘手的;p 有一个身份管理器(阅读:缓存)可以确保你总是得到当数据库看到它时,相同的 Country 对象; .{First|Single}[OrDefault](pkid-match).Where(pkid-match).{First|Single}[OrDefault]() 使用 来避免往返。它正在 本地 对这个缓存进行Id == 1 查询。
  • 酷。在那种情况下,当我运行以下命令时,为什么最后是 c == null ?国家 c = 新国家 { Id = 123 }; Db.Countries.InsertOnSubmit(c); c = Db.Countries.FirstOrDefault(x => x.Id == 123);
  • @enashnash 大概它没有针对123 进行缓存,因为它知道该数字在数据库覆盖它之前是无关紧要的?也许?当然,一旦它获取记录一次,身份管理器就会启动 - 也许这就是这里所缺少的。
  • 嗯,这并不能解释为什么它在我引用的问题中起作用并且对我不起作用。还是说Id == 1的对象一定已经存在于引用问题的数据库中?
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多