首页 文章

将连接字符串传递给代码优先的DbContext

提问于
浏览
80

如何将连接字符串传递给实体框架的代码优先DbContext?当DbContext和web.config中的连接字符串位于同一个项目中并以相同的方式命名时,我的数据库生成正常工作 . 但是现在我需要将DbContext移动到另一个项目,所以我正在测试将连接字符串传递给它,如下所示:

Model & Context

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Action

public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

如果我在操作中设置断点,则分析 db ,连接字符串就在那里,但它不会创建或查找数据库或任何内容 .

Build 与SQL Server的连接时发生与网络相关或特定于实例的错误 . 服务器未找到或无法访问 . 验证实例名称是否正确,以及SQL Server是否配置为允许远程连接 . (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)

9 回答

  • 2

    比赛有点晚了,但另一个选择是:

    public class NerdDinners : DbContext
    {
        public NerdDinners(string connString)
        {
            this.Database.Connection.ConnectionString = connString;
        }
        public DbSet<Dinner> Dinners { get; set; }
    }
    
  • 0

    阅读文档后,我必须传递连接字符串的名称:

    var db = new NerdDinners("NerdDinnerDb");
    
  • 35

    以为我会为那些寻找“如何将连接字符串传递给DbContext”的人添加此位:您可以为基础数据存储区构造连接字符串,并将整个连接字符串传递给从DbContext派生的类型的构造函数 .

    (从@Lol Coder重新使用代码) Model & Context

    public class Dinner
    {
        public int DinnerId { get; set; }
        public string Title { get; set; }
    }
    
    public class NerdDinners : DbContext
    {
        public NerdDinners(string connString)
            : base(connString)
        {
        }
        public DbSet<Dinner> Dinners { get; set; }
    }
    

    然后,假设您使用SqlConnectioStringBuilder构造一个Sql连接字符串,如下所示:

    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());
    

    GetConnectionString方法构造适当的连接字符串,SqlConnectionStringBuilder确保连接字符串语法正确;然后你可以像这样实例化你的db conetxt:

    var myContext = new NerdDinners(builder.ToString());
    
  • 1

    在你的DbContext中,为你的DbContext创建一个默认构造函数,并像这样继承基类:

    public myDbContext()
            : base("MyConnectionString")  // connectionstring name define in your web.config
        {
        }
    
  • 74

    如果您在应用程序中构建连接字符串,那么您将使用connString命令 . 如果您在Web配置中使用连接字符串 . 然后使用该字符串的“名称” .

  • 27

    我有一个针对该问题的解决方案示例 .

    MyDBContext.cs

    public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
      {
          if(ConnectionType==DBConnectionType.MainConnection)
           {
             this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
           }
          else if(ConnectionType==DBConnectionType.BackupConnection)
           {
             this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
           }
      }
    

    MyClass.cs

    public enum DBConnectionType
     {
        MainConnection=0,
        BackupConnection=1
     }
    

    frmMyForm.cs

    MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                                   //or
    //MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
    
  • 1

    检查web.config中连接字符串的语法 . 它应该像 ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

  • 55

    使用EF模型时,每个项目中都有一个使用EF模型的连接字符串 . 例如,我在一个单独的类库中有一个EF EDMX模型 . 我的web(mvc)项目中有一个连接字符串,以便它可以访问EF db .

    我还有另一个用于测试存储库的单元测试项目 . 为了使存储库访问EF db,测试项目的app.config文件具有相同的连接字符串 .

    应该配置数据库连接,而不是编码,IMO .

  • 2

    看不到你的代码有什么问题,我使用SqlExpress,当我在构造函数中使用连接字符串时它工作正常 .

    你在项目中创建了一个App_Data文件夹,不是吗?

相关问题