我现在正在学习LINQ-to-SQL,我编写了一个定义SQL数据的简单应用程序:
[Table( Name = "items" )]
public class Item
{
[ Column( IsPrimaryKey = true, IsDbGenerated = true ) ]
public int Id;
[ Column ]
public string Name;
}
我已启动连接到同一.sdf文件的2个应用程序副本,并测试一个应用程序中的所有数据库修改是否影响另一个应用程序。但奇怪的是出现了。如果我在一个应用程序中使用InsertOnSubmit()和DeleteOnSubmit(),则通过“select”LINQ队列在其他应用程序中立即可以看到添加/删除的项目。但是,如果我尝试在一个应用程序中修改“名称”字段,它在其他应用程序中不可见,直到它重新连接数据库:(。我使用的测试代码:
var Items = from c in db.Items
where Id == c.Id
select c;
foreach( var Item in Items )
{
Item.Name = "new name";
break;
}
db.SubmitChanges();
有人可以建议我做错了,为什么InsertOnSubmit()/ DeleteOnSubmit有效,而SubmitChanges()却没有?
答案 0 :(得分:2)
这与Linq-to-Sql管理Object Identity的方式有关。如果您多次查询同一个实体,您将始终收到表示数据库中行的相同对象。
当您insert
或delete
个实体时,您可以看到来自其他客户端的更改,因为Linq-to-Sql需要创建/删除与这些实体关联的对象,如果有没有冲突,这没有问题。
更新的行为与Object Identity文章中解释的不同。
LINQ to SQL使用这种方法 管理本地对象的完整性 为了支持乐观 更新。因为只有改变 在对象开始之后发生 创造的是那些由 申请,意图 申请很清楚。
如果您需要数据库中最新的数据,请使用DataContext.Refresh
和RefreshMode.OverwriteCurrentValues
。