Откат MVC Entity Framework не работает - PullRequest
0 голосов
/ 04 января 2019

Привет. Я пытаюсь использовать транзакции в моем приложении, написанном на MVC.net. У меня есть dbcontext в слое, и я получаю его с бизнес-уровня.Когда я запускаю код, он не выдаёт мне никаких ошибок, но также не совершает транзакцию вообще.

Это мой контекст

public class DB : IDisposable
{
    public DB()
    {


    }

    private RootDYSContext _ctx = null;
    public RootDYSContext ctx
    {
        get
        {
            if (_ctx == null)
                _ctx = new RootDYSContext();
            return _ctx;
        }
        set
        {
            _ctx = value;
        }
    }
    public bool Commit()
    {
        try
        {
            ctx.SaveChanges();
        }
        catch (Exception exp)
        {
            Mesaj = exp.Message;
            return false;
        }
        return true;

    }
}

И вот как я пытаюсь сделать транзакцию, которая основана на здесь "https://docs.microsoft.com/en-us/ef/core/saving/transactions"

    public bool CreateKullanici(VMKullanici 
    KullaniciData,List<VMRol>RolDataList,VMRol AnaRolData)
    {
        string mesaj = "";
        int kullanici_id;

        using (RootDBHelper.DB db = new RootDBHelper.DB())
        {

            using (var ctx = new RootDBLayer.RootDYSContext())
            {
                using (DbContextTransaction dbContextTransaction = 
                   ctx.Database.BeginTransaction())
                {
                    try
                    {
                        kullanici_id = SaveKullanici(KullaniciData, out 
                   mesaj);
                        foreach(VMRol rol in RolDataList)
                        {
                            VMKullaniciRol KullaniciRolInsertData = new 
                                  VMKullaniciRol();
                            KullaniciRolInsertData.kullanici_id = 
                              kullanici_id;
                            KullaniciRolInsertData.rol_id = rol.rol_id;

                            if (rol.rol_id == AnaRolData.rol_id)
                                KullaniciRolInsertData.ana_rol_mu = 
                                   (int)RConstants.EvetHayir.Evet;
                            else
                                KullaniciRolInsertData.ana_rol_mu = 
                             (int)RConstants.EvetHayir.Hayir;


                bKullaniciRol.SaveKullaniciRol(KullaniciRolInsertData, out mesaj);
                        }
/*Edit:I think this line made confusion I put this to make sure rollback 
                        dbContextTransaction.Rollback(); */
                     dbContextTransaction.Commit();

                        return true;
                    }
                    catch
                    {
                        dbContextTransaction.Rollback();
                        return false;
                    }

                }
            }
        }
    }

Я ожидаю, когда язапустить это, я не должен получить никакой записи вообще. Я серьезно застрял, потому что я не получаю никакой ошибки или какой-либо подсказки вообще, и этот метод сохраняет данные независимо от отката. Заранее спасибо.

Редактировать: я делаю мойсохранить изменения в методах вставки. Добавление также примеров кода для методов

    public int SaveKullanici(VMKullanici KullaniciData, out string mesaj)
    {
        using (RootDBHelper.DB db = new RootDBHelper.DB())
        {
            mesaj = "";
            PKullanici pKullanici = new PKullanici();
            if (KullaniciData.kullanici_id == default(int))
                pKullanici.InsertKullanici(db.ctx, KullaniciData);
            else
                pKullanici.UpdateKullanici(db.ctx, KullaniciData);
            if (db.Commit())
            {
                return KullaniciData.kullanici_id;
            }
            else
            {
                mesaj = db.Mesaj;
                return -1;
            }
        }
    }



    public void InsertKullanici(RootDYSContext ctx, VMKullanici KullaniciData)
    {
        ctx.TKullanici.Add(KullaniciData.TKullanici);
    }

1 Ответ

0 голосов
/ 04 января 2019

Я думаю, что ваша проблема в том, что вы делаете коммит, а затем хотите откатить, но вам нужно сделать одно коммит или откат.

Кроме того, я не вижу в вашем коде, где вы на самом деле делаете транзакции.В вашем коде есть функция commit, но commit! = Savechanges.

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

Также обратите внимание, что если вы не делаете коммитов или не выполняете откат, тогда ваше поле идентификации будет увеличиваться независимо от того, что

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