动态地更改数据库MVC3和4.1的EntityFramework(Dynamicly Change

2019-10-19 00:19发布

我工作的一个MVC3应用数据库第一种方法。 我想用一个连接字符串来连接数据库的基础上,一些字符串(公司名称)。 例如:我在MSSQL快递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中,但我怎么能我使用obracun_placEntities1 DB =新obracun_placEntities1(),其中使用在UsersController和所有其他控制器; >此采取默认的数据库从web.config中。 我不希望连接字符串保存到会话或Cookie及比它传递在每一个CONTROLER作为参数。 private obracun_placEntities1 db = new obracun_placEntities1();

我怎样才能做到这一点我通过在登录控制器连接字符串,并使用在整个项目中该数据库。

还有一个问题发生时,我想用公共静态字符串nameOrConnectionString并将它传递给构造函数。 问题是,当我在Chrome中打开应用程序和登录的user1的我从user1的数据库中的所有infromation,但后来我在MS Explorere因为user2的登录并获得来自user2的数据库中的所有数据。 当我刷新铬我从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")

    {

    }

Answer 1:

连接到不同的数据库使用上的DbContext的构造的DbConnection最好的做法。 如果你看的DbContext类,你会看到多个构造函数重载。 一个允许供给的DBConnection的。 因此,在web.config中/ App.Config中没有条目是必需的。

看到这个帖子与示例代码同样的背景下访问不同的数据库。

编辑样品补充说:

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


Answer 2:

我finnaly得到它与此代码工作。

我的LoginController

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

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

我叫EntityConnection康恩= GetEntityConnDbName( “服务器名称”, “FirmName”)。 _entities =新obracun_placEntities1(康涅狄格州,FALSE);

VAR用户从r和_entities.UPORABNIK.Where(R => == r.ime用户&& &&密码== r.geslo今天<= r.veljavnost).ToList()选择R =;

我从后形式firmName所以这项工作只有在LoginController.But我怎么能在所有其他控制器使用这个构造? 我在LoginControler得到公司的名字只有一次,我试图将其保存为Cookie,但我就不能在构造函数中读取它。 在我的其他控制器我再次使用默认的控制器。 我怎样才能转院康涅狄格州向其他控制器?

私人obracun_placEntities1 obracun_placEntities1分贝=新();

我想这样的呼吁

私人obracun_placEntities1分贝=新obracun_placEntities1(conn);在

或者是有一些更好的办法?



文章来源: Dynamicly Change Database MVC3 and EntityFramework 4.1