ASP.NET和Dapper.NET简介

3

有人能解释一下在Dapper中使用Glimpse的情况吗?还是它仅适用于Entity Framework?

编辑:

 public List<UserRole> GetUserRoles(string userName)
    {
        using (var block = new TransactionBlock())
        {
            const string sql = "SELECT AspNetRoles.Name FROM AspNetUsers INNER JOIN " +
                               "AspNetUserRoles ON AspNetUsers.Id = AspNetUserRoles.UserId INNER JOIN " +
                               "AspNetRoles ON AspNetUserRoles.RoleId = AspNetRoles.Id " +
                               "WHERE (AspNetUsers.UserName = @userName)";
            var results = TransactionBlock.Connection.Query<UserRole>(sql, new{userName}, transaction: TransactionBlock.Transaction).ToList();
            block.Commit();
            return results;
        }
    }

*EDIT *

public class TransactionBlock : IDisposable
{
    private bool m_FirstTransactionBlock = false;
    private bool m_Disposed = false;

    public TransactionBlock(string connectionStringConfigKey = null)
    {
        if (connectionStringConfigKey != null && CurrentTransaction != null)
            throw new Exception("Can't create a new transactionBlock with a specific connectionstring if you are already within a block.");

        // Open a connection if we haven't yet already          
        if (CurrentTransaction == null) // we don't have a transaction yet so create one:
        {
            var localConnectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

            var conn = new SqlConnection(localConnectionString); // Create a new connection object for the connection string.
            try
            {
                conn.Open();
            }
            catch (SqlException ex)
            {
                // Severity 20 errors are returned when there are connection
                // problems, so we only retry if the severity is 20.
                // Don't worry about deadlock errors in here - we're just connecting
                // to the database, not running anything which could be deadlocked.
                if (ex.Class != 20) throw;
                // Clear connection pool of all connections related to the given connection string.
                SqlConnection.ClearPool(conn);
                // Try to open the connection once again, catching any error.
                try { conn.Open(); }
                catch { conn = null; }
                // If 2nd attempt failed, throw original exception.
                if (conn == null) throw;
            }
            CurrentTransaction = conn.BeginTransaction();
            m_FirstTransactionBlock = true;
        }
    }

    public void Commit()
    {
        if (m_FirstTransactionBlock)
        {
            Dispose(true);
        }
    }

    public void Dispose()
    {
        if (m_FirstTransactionBlock)
        {
            Dispose(false);
        }
    }

    public void Dispose(bool commit)
    {
        if (m_Disposed)
            return; // committed and cleaned up already.

        try
        {
            var transaction = CurrentTransaction;
            var connection = transaction.Connection; // taking a reference to the connection object as rollback will set it to null;

            if (commit)
            {
                transaction.Commit();
            }
            else // rollback the transaction if it hasn't been commited.
            {
                transaction.Rollback();
            }

            if (connection != null)
            {
                connection.Close();
                connection.Dispose();
            }

            transaction.Dispose();
        }
        finally // ensure that regardless of connection exceptions, the state is set to disposed.
        {
            // remove current transaction from context.
            CurrentTransaction = null;
            m_Disposed = true;
        }
    }

    private static SqlTransaction CurrentTransaction
    {
        get
        {
            return CurrentContext.GetItem<SqlTransaction>("__Transaction");
        }
        set
        {
            CurrentContext.SetItem("__Transaction", value);
        }
    }

    public static SqlConnection Connection
    {
        get { return CurrentTransaction.Connection; }
    }
    public static SqlTransaction Transaction
    {
        get { return CurrentTransaction; }
    }

    public static string ConnectionString
    {
        get
        {
            return System.Configuration.ConfigurationManager.AppSettings.Get("ConnectionString");
        }
    }
2个回答

8
啊,感谢提供TransactionBlock代码,这立即显示了Glimpse未拦截任何DB调用的原因。
尝试使用DbProviderFactories类,更改以下行:
var localConnectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
var conn = new SqlConnection(localConnectionString);       

使用

var localConnectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"];
var factory = DbProviderFactories.GetFactory(localConnectionString.ProviderName); 
var conn = factory.CreateConnection();

谢谢@cgijbels,我今晚会尝试。感谢您的回复。 - CSharpNewBee
值得一提的是,您需要明确设置连接字符串:conn.ConnectionString = localConnectionString.ConnectionString; - Gary Chapman

3

你是否尝试过使用Glimpse.ADO包?


嗨,Anthonyv,我已经安装了它,但它仍然是灰色的。 - CSharpNewBee
你是如何创建连接/命令的?我已经在示例项目中使用了Dapper,并且它正常工作。请参考此示例- https://github.com/Glimpse/Glimpse/blob/master/source/Glimpse.Mvc3.MusicStore.Sample/Controllers/HomeController.cs#L218。 - anthonyv
请看上面的编辑,安东尼,这显示了我如何使用Dapper连接到SQL。 - CSharpNewBee
@CSharpNewBee,TransactionBlock是从哪里来的?因为看起来它似乎是提供给您连接的一个功能块,因此了解如何获取该连接将会很有趣。 - cgijbels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接