Сущность транзакции не работает - PullRequest
1 голос
/ 07 февраля 2011

Я пробовал транзакцию объекта с помощью следующего кода, но, к сожалению, это не работает для отката транзакции. Пожалуйста, помогите мне.

    public void AddAGMDate()
    {
        DbTransaction Transaction = null;
        using (EntityConnection DatabaseConnection = new EntityConnection("name=Insta_SAEntities"))
        {
            try
            {
                if (DatabaseConnection.State == ConnectionState.Closed)
                    DatabaseConnection.Open();//open connection
            var CurrentContext = new Insta_SAEntities(DatabaseConnection);
            Transaction = CurrentContext.Connection.BeginTransaction();//begin transaction

            TR_AGMDatesEntityObject objAGMDates = new TR_AGMDatesEntityObject();
            objAGMDates.ClientID = Convert.ToInt64(ddlClientName.SelectedValue);
            objAGMDates.AGMDate =  Convert.ToDateTime(txtAGMDate.Text.Trim());
            objAGMDates.CreatedBy = 0;
            objAGMDates.CreatedDate = Convert.ToDateTime(System.DateTime.Now);
            objAGMDates.UpdatedBy = 0;
            objAGMDates.UpdatedDate = Convert.ToDateTime(System.DateTime.Now);
            int result = AGMDatesBL.AddAGMDate(objAGMDates);

            if (true)
            {
                int n1 = 10, n2 = 0;
                int res = n1 / n2;//Error, want transaction to rollback (for taesting)
            }

            Transaction.Commit();//commit transaction

            if (result == 1)
            {

                ScriptManager.RegisterClientScriptBlock(Page, GetType(), "script", "alert('AGM Date Successfully entered ');" +
                 "window.location.href='ManageAGMDate.aspx';", true);
            }
            else if (result == 2)
            {

                txtAGMDate.Text = "";
                ScriptManager.RegisterClientScriptBlock(Page, GetType(), "script", "alert('AGM Date Already Exist!');", true);


            }
            else if (result == 0)
            {
                ScriptManager.RegisterClientScriptBlock(Page, GetType(), "script", "alert('Unable to Add AGM Date!');" +
                "window.location.href='ManageAGMDate.aspx';", true);
            }
        }
        catch (Exception ex)
        {
            Transaction.Rollback();//rollback transaction

            if (log.IsErrorEnabled) log.Error(string.Format("{0} ,Page URL={1}, Method Name={2} ,Error={3}", _LogMsgAdd, Request.Url.AbsoluteUri, MethodInfo.GetCurrentMethod().DeclaringType.FullName + "." + MethodInfo.GetCurrentMethod().Name, ex.Message.ToString()));
            Session["error"] = ex.Message.ToString();
            Response.Redirect("~/Common/Errors/ErrorPageWM.aspx?ShB=Y", false);
        }
        finally
        {

            if (DatabaseConnection != null)
            {
                if (DatabaseConnection.State == ConnectionState.Open)
                    DatabaseConnection.Close();
            }
        }

}

1 Ответ

2 голосов
/ 07 февраля 2011

Вы пытались использовать System.Transactions.TransactionScope ** вместо этого? (Это популярный и распространенный способ обработки транзакций в .NET).

например.

using (EntityConnection DatabaseConnection =         
    new EntityConnection("name=Insta_SAEntities"))
    {
    using(var transactionScope = new TransactionScope())
    {
        TR_AGMDatesEntityObject objAGMDates = new TR_AGMDatesEntityObject();
        // Set properties...

        int result = AGMDatesBL.AddAGMDate(objAGMDates);

        // I have no idea what this logic does ... but I don't care, cause i'm just
        // copying what u wrote.
        if (true)
        {
            int n1 = 10, n2 = 0;
            int res = n1 / n2;//Error, want transaction to rollback (for taesting)
        }
        else
        {
            transactionScope.Commit();
        }
    }

    // The rest of your logic now happens here....

Окей .. так что если вы НЕ выполните Commit() внутри блока TransactionScope(), то он автоматически сделает RollBack(); В противном случае вы можете вызвать откат с помощью transactionScope.RollBack(); .. как

if (true)
{
    int n1 = 10, n2 = 0;
    int res = n1 / n2;
    transactionScope.RollBack();
}
else
{
    transactionScope.Commit();
}

НТН.

**** Ловушка для молодых игроков **: Код этой транзакции находится в System.Transactions.dll .., поэтому убедитесь, что вы добавили эту сборку.

enter image description here enter image description here

...