LINQ-to-SQL和SQL Compact - 数据库文件共享问题

时间:2009-11-19 10:09:41

标签: linq-to-sql sql-server-ce

我现在正在学习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()却没有?

1 个答案:

答案 0 :(得分:2)

这与Linq-to-Sql管理Object Identity的方式有关。如果您多次查询同一个实体,您将始终收到表示数据库中的相同对象。

当您insertdelete个实体时,您可以看到来自其他客户端的更改,因为Linq-to-Sql需要创建/删除与这些实体关联的对象,如果有没有冲突,这没有问题。

更新的行为与Object Identity文章中解释的不同。

  

LINQ to SQL使用这种方法   管理本地对象的完整性   为了支持乐观   更新。因为只有改变   在对象开始之后发生   创造的是那些由   申请,意图   申请很清楚。

如果您需要数据库中最新的数据,请使用DataContext.RefreshRefreshMode.OverwriteCurrentValues