Обновление объектов LinqToSql - PullRequest
2 голосов
/ 12 марта 2012

У меня есть 3 класса:
BasePlace, Hall, HallPlan.

Отношения:
BasePlace - Hall: один ко многим.
Hall - HallPlan: один ко многим.

Я получаю места (места) из удаленной программы. У меня есть следующий метод для добавления (или обновления) объекта:

public void AddPremieraPlace(IEnumerable<BasePlace> places)
        {
            if(places != null)
            {
                foreach (var place in places)
                {
                    //is exist in db
                    var dbPlace = Database.BasePlaces.FirstOrDefault(p => p.OIDPremiera == place.OIDPremiera);
                    // if exist update properties and collections
                    if (dbPlace != null)
                    {
                        dbPlace.Name = place.Name
                        dbPlace.Halls = place.Halls;
                    }
                    else
                        Add(place); // just add new place

                    Database.SubmitChanges();                    
                } 

            }
        }

Когда место в БД существует, тогда обновления работают не правильно. В Hall и HallPlan создается дубликат: Hall таблица, например:

OID   Name       PlaceId  OIDPremiera
19  Redisson        NULL        1
20  Test 2          NULL        3
21  Test 3          NULL        2

22  Redisson        5           1
23  Test 2          5           3
24  Test 3          5           2

Как правильно обновить? Спасибо.

Add()

public virtual void Add(TClass entity)
        {
            Check.Argument.IsNotNull(entity, "entity");

            Database.GetTable<TClass>().InsertOnSubmit(entity);
        }

1 Ответ

3 голосов
/ 12 марта 2012

LINQ-to-SQL имеет менеджер идентичности;если он находит в дереве что-то, что он не распознает (то есть не находится в диспетчере удостоверений), то он предполагает, что его следует рассматривать как вставку для этого элемента.Поэтому, поскольку он не распознает ваши Hall экземпляры, он вставляет их.

Существует два способа решения этой проблемы:

  • вместо непосредственного присвоения Halls изваша модель не из L2S для модели L2S, вы можете запросить контекст данных для соответствующего экземпляра, т.е. в цикле, используйте ctx.Halls.FirstOrDefault(...), чтобы получить эквивалент Hall из контекста данных,и добавьте , что вместо исходного
  • , используйте метод Attach (то есть ctx.Halls.Attach(...)), чтобы L2S узнал об экземплярах зала перед началом
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...