Как я ошибся в моем DataContext? - PullRequest
4 голосов
/ 15 ноября 2010

Я уже некоторое время работаю с LINQ To SQL, и в решении обычно я делаю следующее:

  • В проекте я создаю схему dbml.
  • В другом проекте я создаю простой DataAccessLayer (DAL), который знает мой первый проект, и создает экземпляр DataContext.
  • В третьем проекте (бизнес-логика) я создаю экземпляр моего DAL.

Это обычно работает хорошо.Однако на этот раз я не знаю почему, но «Это» не работает.«Это», «Я обновляю базу данных».Я изменил свой код, чтобы сделать несколько тестов, и я получил результат, которого я не понимаю.

MyDataContext dataContext = new MyDataContext(MyConnectionString);
DataBaseItem dbi = (from item in dataContext.DataBaseItems
    where item.ID == 1
    select item).First();
dbi.Name= "toto";
// dataContext.GetChangeSet() tells me nothing changed.

Я вырыл глубже, взломав bdi.Name = "toto"; и сравнил его с аналогичным присвоением значения в проекте, где он работает (оба кода сгенерированы дизайнером) и увидел, что какой-то код отсутствует (я написалих там, но я прокомментировал их, чтобы вы увидели, чего не хватает):

[Column(Storage="_Name", DbType="NVarChar(250)")]
public string Name
{
    get
    {
        return this._Name;
    }
    set
    {
        if ((this._Name!= value))
        {
            //this.OnLayoutChanging(value);
            //this.SendPropertyChanging();
            this._Name= value;
            //this.SendPropertyChanged("Name");
            //this.OnLayoutChanged();
        }
    }
}

Кто-нибудь может сказать мне, почему эти строки отсутствуют, и где я все испортил?

КогдаЯ делаю dataContext.Refresh(RefreshMode.KeepChanges, dataContext.DataBaseItems);, получаю ошибку:

Объект, указанный для обновления, не распознается.

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Если у ваших объектов нет первичного ключа, то объекты не будут отслеживаться на предмет изменений. Вероятно, ID не был установлен в качестве первичного ключа в базе данных.

1 голос
/ 15 ноября 2010

Ошибка была в IDE (VS2008). Генерация или регенерация любого объекта Linq-to-Sql в среде IDE была ошибочной. Чтобы решить проблему, мне пришлось:

  1. Удалите объекты, которые были ошибочными.
  2. Закрыть Visual Studio.
  3. Открыть Visual Studio.
  4. Воссоздать объекты.

Невозможно выполнить первую остановку и вместо этого восстановить объект путем изменения параметра, возможно, сработало бы, но я не могу проверить это, поскольку не знаю, как воспроизвести проблему.

...