簡體   English   中英

實體框架6數據庫優先方法中DbContext對象之間的共享連接

[英]Share connection between DbContext objects in Entity Framework 6 Database first approach

我正在嘗試使用EF 6在2個不同的數據庫上下文對象之間共享連接。 我已經在這里提到的代碼https://msdn.microsoft.com/en-us/data/dn456843.aspx可以用於單個數據庫上下文,但是一旦我嘗試與另一個數據庫上下文對象共享連接,我就是遇到麻煩了。 以下是我這樣做的目的。

public class MyUnitOfWork
{
              // BAD CODE : having static connection / transaction is bad design , i  use DI to implement  this properly without need for static fields , this code is used here to avoid having to mention my DI configuration; 
                public static EntityConnection _commonConnection ;
                public static System.Data.Entity.DbContextTransaction _commonTransaction;
                // Generic function to create DBContext object based on T supplied.
            public static T GetDbContext<T>()
            {
                 if(_commonConnection  == null)

                  {
                     // generates a generic connection string 
                        _commonConnection = new EntityConnection(DbContextBase.GenerateConnectionString()); 

                        _connection.Open();

                        _commonTransaction = _connection.BeginTransaction(System.Data.IsolationLevel.Snapshot);
                  }
                        T myContextObject = (T)Activator.CreateInstance(typeof(T), new object[1] { _connection });
                        myContextObject .Database.UseTransaction(_transaction);
                       return myContextObject;
            }
}

連接字符串的生成代碼如下:

string GenerateConnectionString()
{
            var entityBuilder = new EntityConnectionStringBuilder
            {
                Provider = "System.Data.SqlClient",                     
                ProviderConnectionString = SharedDatabase.SQLBase.DBconnection + "multipleactiveresultsets=True;" ,
                Metadata = @"res://*/;"
            };

       return entityBuilder ;
}

然后,可以像這樣從函數的不同位置調用GetDbContext。

GetById(int id)
{
   var dbcontext = MyUnitOfWork.GetDbContext<OrdersDbContext>();
  return dbcontext.Orders.Where(.......);


}

GetCustomerInfo( int id)
{
   var dbcontext = MyUnitOfWork.GetDbContext<CustomerDbContext>();
  return dbcontext.Customer.Where(.......);

}

因為我正在使用通用元數據部分,所以在實體框架中出現錯誤“無論名稱空間如何,都不能有多個具有相同名稱的實體”

但是,如果我指定.csdl / .ssdl文件的名稱,則連接(以及事務)將不再常見,我必須為每個DBContext創建一個連接和事務(這是我要避免的事情)

看來我撞到了。 有沒有辦法讓我使用相同的連接而不出現重復的實體錯誤? 將實體名稱更改為其他名稱對我來說不是一個選擇,因為這將是非常耗時的更改,我必須在30多個db上下文/ EDMX文件中進行更改,這會對生產產生巨大影響。

使用事務(EF6及更高版本)所示,使用以下代碼為您的上下文提供現有事務:

string GenerateConnectionString()
{
    return SharedDatabase.SQLBase.DBconnection + "multipleactiveresultsets=True;";
}


public class MyUnitOfWork
{
    SqlConnection _commonConnection;
    DbTransaction _commonTransaction;
    // Generic function to create DBContext object based on T supplied.
    public T GetDbContext<T>()
    {
        if (_commonConnection == null)
        {
            // generates a generic connection string 
            _commonConnection = new SqlConnection(DbContextBase.GenerateConnectionString());

            _commonConnection.Open();

            _commonTransaction = _connection.BeginTransaction(IsolationLevel.Snapshot);
        }

        MetadataWorkspace workspace = new MetadataWorkspace(
          string.Format("res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl;", typeof(T).Name).Split('|'), 
          new Assembly[] { Assembly.GetExecutingAssembly() });

        var connection = new EntityConnection(workspace, _commonConnection);
        T myContextObject = (T)Activator.CreateInstance(typeof(T), new object[] { connection });
        myContextObject.Database.UseTransaction(_commonTransaction);
        return myContextObject;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM