动态更改数据库MVC3和实体框架4.1

时间:2013-11-21 09:58:17

标签: sql-server asp.net-mvc-3 entity-framework

我正在研究MVC3应用程序数据库的第一种方法。我想根据一些字符串(公司名称)使用一个连接字符串连接到数据库。示例:我在MSSQL Express 2012中有这个db:my_database_microsoft,my_database_oracle等等。(这些数据库具有相同的结构)。在登录页面上,我有3个输入字段:用户名,密码,公司。我知道如何使用SqlConnectionStringBuilder构建连接字符串动态,然后在EntityConnectionStringBuilder上使用它

string providerName = "System.Data.SqlClient";
string serverName = "MY-PC\\SQL2012";
string databaseName = "my_database_"+form[company].toString();
.....
.....

  entityBuilder.Provider = providerName;

// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;

// Set the Metadata location.
entityBuilder.Metadata =@"res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl";

using (EntityConnection conn =
    new EntityConnection(entityBuilder.ToString()))
{
    conn.Open();

   // Console.WriteLine("Just testing the connection.");

    conn.Close();
}


obracun_placEntities1.nameOrConnectionString = entityBuilder.ToString();
obracun_placEntities1 o = new obracun_placEntities1(entityBuilder.ToString());

我已经为我的entety制作了一个部分类,并给出了一个构造函数,它将nameOrConnectionString字符串作为参数。

public partial class obracun_placEntities1
{
   public string nameOrConnectionString { get; set; }

    public obracun_placEntities1(string nameOrConnectionString)
        : base(nameOrConnectionString ?? "obracun_placEntities1") { }

}

这仅适用于loginController,但我如何在UsersController和我使用obracun_placEntities1 db = new obracun_placEntities1();的所有其他控制器中使用它。 >这从web.config获取默认数据库。我不想将连接字符串保存到会话或cookie,而是将其作为参数传递给每个控制器。      private obracun_placEntities1 db = new obracun_placEntities1();

如何实现我在登录控制器中传递连接字符串并在整个项目中使用此数据库。

当我想使用公共静态字符串nameOrConnectionString时,又出现了一个问题 并将其传递给构造函数。问题是当我在Chrome中打开应用程序并以user1身份登录时,我从user1数据库获得所有信息,但随后我以MS2登录MS2并从user2数据库获取所有数据。当我刷新chrome时,我从user2数据库获取信息而不是user1。

Model1.context.cs

  public partial class obracun_placEntities1 : DbContext
{
    public static string nameOrConnectionString { get; set; }
   // public static string connection;
    public obracun_placEntities1()
        : base(nameOrConnectionString ?? "obracun_placEntities1")

    {

    }

2 个答案:

答案 0 :(得分:1)

最好使用DBCOntext上的DBconnection构造函数连接到不同的数据库。如果查看DBContext类,您将看到多个构造函数重载。一个允许提供DBConnection。因此,WEB.Config / App.Config中不需要任何条目。

请参阅此帖子,示例代码为Same Context accessing different databases.

添加了EDIT样本:

 public partial class obracun_placEntities1 : DbContext
{
    // use THIS CONSTRUCTOR
    protected obracun_placEntities1(DbConnection dbConnection, bool contextOwnsConnection)
        : base(dbConnection, contextOwnsConnection)
    {
    }

     }
}

// DONT USE THIS
//    obracun_placEntities1.nameOrConnectionString = entityBuilder.ToString();
 //        obracun_placEntities1 o = new obracun_placEntities1(entityBuilder.ToString());`

// build the connection - note: it is NOT a connection string. it is a DBConnection!

   conn = getDBConnection4SQLServer(DatabaseServer,Databasename)
   obracun_placEntities1 o = new obracun_placEntities1(conn,true);

 //====================================================================

 public const string DefaultDataSource = "localhost";

 public DbConnection getDBConnection4SQLServer(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;

        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }

答案 1 :(得分:0)

我最终让它使用此代码。

我的LoginController

    [HttpPost]
    public ActionResult Index(UPORABNIK model, FormCollection form)
    {....}

    public obracun_placEntities1(EntityConnection entityConnection)
        : base(entityConnection, false)
    {
    }

我调用EntityConnection conn = GetEntityConnDbName(“ServerName”,“FirmName”)。  _entities = new obracun_placEntities1(conn,false);

var uporabniki =来自r in _entities.UPORABNIK.Where(r => r.ime == uporabnik&& r.geslo == geslo&& danes< = r.veljavnost).ToList( )                              选择r;

我从post表单中获取了firmName,所以这只在LoginController中工作。但是我如何在所有其他控制器中使用这个构造函数?我在LoginControler中只获取一次公司名称,我试图将其保存为cookie,但后来我无法在构造函数中读取它。 在我的其他控制器中,我再次使用默认控制器。如何将conn传送给其他控制器?

private obracun_placEntities1 db = new obracun_placEntities1();

我想像这样打电话

private obracun_placEntities1 db = new obracun_placEntities1(conn);

或者有更好的方法吗?