【问题标题】:Dynamicly Change Database MVC3 and EntityFramework 4.1动态更改数据库 MVC3 和实体框架 4.1
【发布时间】:2013-11-21 09:58:16
【问题描述】:

我正在研究 MVC3 应用程序数据库优先方法。我想使用一个连接字符串连接到数据库,基于一些字符串(公司名称)。示例:我在我的 MSSQL Express 2012 中有这个数据库: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());

我已经为我的实体创建了一个部分类,并提供了一个以 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 数据库中获取所有信息,但随后我以 user2 身份登录 MS Explorere 并从 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")

    {

    }

【问题讨论】:

  • 所以你有一些答案,但没有反馈 lozo

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


【解决方案1】:

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

查看这篇文章的示例代码Same Context accessing different databases.

添加编辑示例:

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

【讨论】:

    【解决方案2】:

    我终于让它与这段代码一起工作。

    我的登录控制器

        [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 = from r in _entities.UPORABNIK.Where(r => r.ime == uporabnik && r.geslo == geslo && danes

    我从 post 表单中获取了公司名称,因此这仅在 LoginController 中有效。但是我如何在所有其他控制器中使用此构造函数?我在 LoginControler 中只获得了一次公司名称,我试图将其保存为 cookie,但后来我无法在构造函数中读取它。 在我的另一个控制器中,我再次使用默认控制器。如何将 conn 转移到其他 Controller?

    私有 obracun_placEntities1 db = 新 obracun_placEntities1();

    我想这样打电话

    私有 obracun_placEntities1 db = new obracun_placEntities1(conn);

    或者有什么更好的方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多