LINQ-to-SQL и SQL Compact - проблема совместного использования файлов баз данных - PullRequest
2 голосов
/ 19 ноября 2009

Я сейчас использую LINQ-to-SQL, и я написал простое приложение, которое определяет данные SQL:

  [Table( Name = "items" )]
  public class Item
  {
    [ Column( IsPrimaryKey = true, IsDbGenerated = true ) ]
    public int Id;
    [ Column ]
    public string Name;
  }

Я запустил 2 копии приложения, подключенного к одному и тому же файлу .sdf, и проверил, влияют ли все модификации базы данных в одном приложении на другое приложение. Но странная вещь возникает. Если я использую 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 Ответ

2 голосов
/ 19 ноября 2009

Это связано с тем, как Linq-to-Sql управляет Идентификацией объекта . Если вы запрашиваете одну и ту же сущность более одного раза, вы всегда получите один и тот же объект, представляющий строку в базе данных.

Когда вы insert или delete сущностей, вы можете видеть изменения от другого клиента, потому что Linq-to-Sql должен будет создать / удалить объекты, связанные с этими сущностями, и, если нет конфликтов, это не проблема.

Обновление имеет другое поведение, объясненное в статье Идентификация объекта .

LINQ to SQL использует этот подход для управлять целостностью локальных объектов для того, чтобы поддержать оптимистичный Обновления. Потому что единственные изменения, которые происходит после того, как объект сначала созданы те, которые сделаны приложение, цель Приложение ясно.

Если вам нужны самые свежие данные из базы данных, используйте DataContext.Refresh с RefreshMode.OverwriteCurrentValues.

...