动态更改数据库MVC3和EntityFramework 4.1 [英] Dynamicly Change Database MVC3 and EntityFramework 4.1

查看:101
本文介绍了动态更改数据库MVC3和EntityFramework 4.1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究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;

//设置特定于提供者的连接字符串。
entityBuilder.ProviderConnectionString = providerString;

//设置元数据位置。
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(只测试连接);

conn.Close();
}


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

我已经做了一个部分类,并给了一个构造函数,它使用一个nameOrConnectionString字符串作为参数。

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

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();



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



当我想使用public static string nameOrConnectionString
并将其传递给构造函数时,还会出现一个问题。问题是当我在Chrome中打开应用程序并以user1身份登录时,我收到来自user1数据库的所有信息,然后我以MS2作为user2登录,并从user2数据库获取所有数据。当我刷新Chrome时,我从user2数据库获取信息而不是user1。



Model1.context.cs

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

{

}


解决方案

连接到不同的数据库最好使用DBCOntext上的DBconnection构造函数。如果你看DBContext类,你会看到多个构造函数重载。一个允许提供DBConnection。所以在WEB.Config / App.Config中没有条目是必需的。



使用示例代码相同上下文访问不同的数据库。



添加的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());`

//构建连接 - 注意:它不是连接字符串。它是一个DBConnection!

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

// ======================================公共字符串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;
}


I am working on an MVC3 application database first approach . I would like to use one connection string to connect to database, based on some string (company name). Example: I have in my MSSQL Express 2012 this db: my_database_microsoft, my_database_oracle and so on..(those databases have same structure). On login page I have 3 input fields: username,password,company. I know how to build connection string dynamic with SqlConnectionStringBuilder and then use it on 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());

I have made a partial class of my entety and give a constructor that take a nameOrConnectionString string as a parameter.

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

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

}

This works only in loginController but how can I use this in UsersController and all other controllers where I using obracun_placEntities1 db = new obracun_placEntities1(); > this take the default database from web.config. I would not like to save connection string to session or cookie and than pass it in every controler as a parameter. private obracun_placEntities1 db = new obracun_placEntities1();

How can i achieve that i pass connection string in login controller and using this database in entire project.

One more problem occured when i want to use public static string nameOrConnectionString and pass it to constructor. The problem is when I open application in Chrome and login as user1 I get all infromation from user1 database, but then I login in MS Explorere as user2 and get all data from user2 database. When i refresh chrome I get information from the user2 database not 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")

    {

    }

解决方案

Connecting to different Databases is best done using the DBconnection constructor on DBCOntext. If you look at the DBContext class you will see multiple constructor overloads. One allows the DBConnection to be supplied. So no entry in WEB.Config/App.Config is required.

See this post with sample code Same Context accessing different databases.

EDIT sample added:

 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;
    }

这篇关于动态更改数据库MVC3和EntityFramework 4.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆