Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先将连接字符串传递给代码DbContext_C#_Entity Framework_Database Connection - Fatal编程技术网

C# 首先将连接字符串传递给代码DbContext

C# 首先将连接字符串传递给代码DbContext,c#,entity-framework,database-connection,C#,Entity Framework,Database Connection,如何将连接字符串传递给实体框架的代码优先DbContext?当DbContext和web.config中的连接字符串位于同一项目中且命名方式相同时,我的数据库生成工作正常。但是现在我需要将DbContext移动到另一个项目,所以我正在测试向它传递一个连接字符串,如下所示: 模型和上下文 public class Dinner { public int DinnerId { get; set; } public string Title { get; set; } } publi

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

模型和上下文

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; }
}
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; }
}
Web.Config

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

如果我在分析
db
的操作中设置了一个断点,那么连接字符串就在那里,但它不会创建或找到数据库或任何东西

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


在web.config中检查连接字符串的语法。它应该类似于
ConnectionString=“Data Source=C:\DataDictionary\NerdDinner.sdf”

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

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


DB连接应该是配置的,而不是编码的,依我看。

看不出你的代码有任何错误,我使用SqlExpress,当我在构造函数中使用连接字符串时,它工作正常


您已经在项目中创建了一个App_数据文件夹,是吗?

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

var db = new NerdDinners("NerdDinnerDb");

如果您正在应用程序中构建连接字符串,则可以使用connString命令。如果您正在web配置中使用连接字符串。然后使用该字符串的“名称”。

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

(重新使用@Lol编码器中的代码) 模型和上下文

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; }
}
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; }
}
其中GetConnectionString方法构造适当的连接字符串,SqlConnectionStringBuilder确保连接字符串语法正确;然后,您可以像这样实例化db conetxt:

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

这里的游戏有点晚了,但另一个选择是:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
公共类nerddinner:DbContext
{
公共NERDINNERS(字符串连接字符串)
{
this.Database.Connection.ConnectionString=connString;
}
公共DbSet晚餐{get;set;}
}

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

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

我有一个解决这个问题的小例子

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;
       }
  }
public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }
 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
MyClass.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;
       }
  }
public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }
 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
frmMyForm.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;
       }
  }
public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }
 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);

对于那些来这里尝试了解如何在构造函数中设置连接字符串时遇到上述解决方案问题(如“初始化字符串的格式不符合从索引0开始的规范”)的人。这是如何修复它的:

public static string ConnectionString
{
    get {
        if (ConfigurationManager.AppSettings["DevelopmentEnvironment"] == "true")
            return ConfigurationManager.ConnectionStrings["LocalDb"].ConnectionString;
        else
            return ConfigurationManager.ConnectionStrings["ExternalDb"].ConnectionString;
    }
}

public ApplicationDbContext() : base(ConnectionString)
{
}


注意:您可能需要添加
Microsoft.EntityFrameworkCore.SqlServer

当它们在同一项目中使用相同名称时,连接字符串可以工作。当我要手动将其传递给DBCONext时,连接字符串不起作用。连接字符串可以正常工作,路径不需要是绝对的。我需要通过代码手动传递连接字符串。我正在使用依赖项注入。你绝对确定你连接到了正确的服务器吗?该错误是典型的SQL Server/Express异常。听起来不像是连接到Sql CE数据库。。。如果数据库不存在,EF代码将首先创建数据库。。。除非找不到路径……基本上,OP的错误是将整个connectionstring发送到DbContaxt构造函数,而不仅仅是名称。正如文档中所说:“DbContext(String)使用给定字符串作为数据库的名称或连接字符串构造一个新的上下文实例”,我将其放入构造函数中,并将其作为公共常量,以备在其他地方引用。要真正硬编码连接字符串,我做了:
public TestAppContext():base(“Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True”){}
Hi!这是唯一让我有所成就的解决方案。我的问题是,我想从Azure配置文件而不是web.config中获取设置。但是,由于缺少“提供程序”设置,这种方法不起作用(在web.config中设置为属性)。有什么想法吗?回答得很好!唯一的更改是删除connString参数,然后使用保存在应用程序设置中的连接字符串…this.Database.connection.ConnectionString=Properties.settings.Default.ConnectionString如何将connString和DbCompiledModel对象作为参数同时传递?很好。只需“这是多余的,您可以删除它。如果您的类模块包含
,则如果重新生成代码,对此文件的手动更改将被覆盖。
在标头中,则可能希望在部分类中实现此功能,如在我的示例中,它会创建一个名为
MyConnectionString
的DB(是的,连接字符串存在)。我必须输入
name=MyConnectionString