TransactionScope с контекстом объекта на зависимых объектах - PullRequest
0 голосов
/ 12 сентября 2011

Я работаю над приложением MVC3 и использую Entity Framework, связанную с базой данных Oracle (11G R2). Я сталкиваюсь с проблемой, когда пытаюсь использовать один объектный контекст внутри TransactionScope.

Вот код:

using (TransactionScope scope = new TransactionScope())
{
    using (Entities context = new Entities())
    {
        // Right insert
        T_RIGRIGHT entity1 = new T_RIGRIGHT()
        {
            RIGCODE = "test1",
            RIGINSERTLOGIN = "aco",
            RIGINSERTDATE = DateTime.Now,
            RIGUPDATELOGIN = "aco",
            RIGUPDATEDATE = DateTime.Now
        };

        context.AddToT_RIGRIGHT(entity1);

        context.SaveChanges();

        // Right/Profile insert
        T_RIPRIGHTPROFILE entity2 = new T_RIPRIGHTPROFILE()
        {
            PROID = 3,
            RIGID = entity1.RIGID,
            RIPINSERTLOGIN = "aco",
            RIPINSERTDATE = DateTime.Now,
            RIPUPDATELOGIN = "aco",
            RIPUPDATEDATE = DateTime.Now
        };

        context.AddToT_RIPRIGHTPROFILE(entity2);

        context.SaveChanges(); // SaveChanges fails due to the FK constraint on table 
    }

    scope.Complete();
}

Позвольте мне объяснить код ...

Сначала я создаю сущность с именем entity1 как элемент T_RIGRIGHT. Я создаю экземпляр элемента T_RIPRIGHTPROFILE, который использует идентификатор элемента T_RIGRIGHT, созданного ранее.

Выполнение завершается неудачно на втором context.SaveChanges(), и исключение касается ограничения Внешнего ключа для таблицы T_RIPRIGHTPROFILE (требуется T_RIGRIGHT).

Надеюсь, мои объяснения достаточно ясны

Есть ли способ заставить его работать?

P.S. : Я прошу прощения за мой английский, поскольку это не мой родной язык.

1 Ответ

1 голос
/ 12 сентября 2011

Вы пытаетесь присвоить FK entity1.RIGID сущности, которая не была зафиксирована в БД:

RIGID = entity1.RIGID,

Если вы внимательно посмотрите на entity1, вы увидите, что RIGID по умолчанию равно 0 - вместо этого вы должны установить свойство навигации, представляющее отношение FK:

RIG = entity1,

Это позволит EF правильно связать эти объекты, поскольку этот объект 1 еще не нужно фиксировать в БД, поэтому вам даже не нужен дополнительный вызов SaveChanges().

Также в вашем сценарии вам не нужен TransactionScope - EF использует транзакцию внутри себя уже в SaveChanges() - исходя из предложенных изменений, вам нужен только один вызов SaveChanges() и, следовательно, не требуется никакой внешней транзакции.

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