Linq to SQL EntitySet Records вызывает дублирование вставки - PullRequest
0 голосов
/ 18 декабря 2009

В приложении WPF я использую Linq to SQL в многоуровневом приложении.

(Это приложение для архивации фотографий), поэтому у каждого раскопа есть соответствующие рисунки, то есть отношение один ко многим. Это отношение правильно создано SQLMetal (который я использую для создания POCO).

Итак, вот ситуация, с которой у меня проблемы:

Сохранение изменений (новых или измененных объектов) выполняется с помощью шаблона UnitOfWork () следующим образом:

using (IUnitOfWork unitOfWork = UnitOfWork.Begin())
                {
         //if this is a new record
                    if (SelectedExcavation.excavation.ExcavationId == 0)
                    {
                        IsNewRecord = true;
                        excavService.Add(SelectedExcavation.excavation);
                    }

                    //send the actual changes to the dbms
                    unitOfWork.Commit();
               }

Все отлично работает!

BUTTTT !!!

Всякий раз, когда обновляется запись, имеющая (уже хотя бы одну) соответствующую запись изображения:

1) вставлена ​​новая запись раскопок

2) текущая запись раскопок обновляется

3) предыдущая Picture Record меняет свой Id на недавно созданный ExcavationId

Что происходит под капотом? Разве Linq to SQL не обрабатывает такие простые сценарии обновления?

Заранее спасибо

1 Ответ

0 голосов
/ 20 декабря 2009

В этом приложении WPF я использую Unity для регистрации IDataContext, который передается в качестве параметра конструктора IUnitOfWork.

Я на самом деле использую многоуровневую архитектуру (которая всегда должна давать мне отдельный объект IUnitOfWork и, следовательно, отдельный IDataContext), но я хочу подделать это поведение, чтобы IUnitOfWork всегда был одним и тем же экземпляром (и, следовательно, IDataContext экземпляр будет одинаковым везде в моем приложении).

Это означает, что приложение использует (классическое) двухуровневое приложение в отношении текста данных!

... и случаи, когда я получаю разрешение (используя Unity), фактически одинаковы везде в моем приложении (я использовал GetHashCode () из них, чтобы подтвердить это).

Так что, кажется, все работает, как ожидалось!

Но, как я уже говорил в моем предыдущем посте, всякий раз, когда запись имеет соответствующие записи EntitySet и обновляется, Datacontext делает это немедленно (в этой последовательности):

1) вставка основной записи со значениями, которые были изначально в записи до изменения

2) обновление подробной записи, изменяющей ее Id на новую основную запись на шаге 1)

3) обновление основной записи с измененными (новыми) значениями.

Шаги 1) и 2) должны появиться НИКОГДА , тогда как только шаг 3) является правильным (и должен быть единственным, появляющимся в текстовом тексте данных.

Я читал во многих блогах, что вам нужно присоединить / отсоединить и сделать какие-то чёрные магические вещи, чтобы преодолеть эту ситуацию, но, к сожалению, везде есть только один и тот же DataContext, поэтому записи всегда прикрепляются к это, так что это явление не должно появляться! (или я что-то упустил)! ???

Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...