코드 우선 DbContext에 연결 문자열 전달


92

엔터티 프레임 워크의 코드 우선 DbContext에 연결 문자열을 어떻게 전달합니까? 내 데이터베이스 생성은 web.config의 DbContext와 연결 문자열이 같은 프로젝트에 있고 이름이 같은 경우 올바르게 작동합니다. 하지만 이제 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 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, 연결 문자열이 있지만 데이터베이스 또는 아무것도 생성하거나 찾지 않습니다.

SQL Server에 대한 연결을 설정하는 동안 네트워크 관련 또는 인스턴스 관련 오류가 발생했습니다. 서버를 찾을 수 없거나 액세스 할 수 없습니다. 인스턴스 이름이 올 바르고 SQL Server가 원격 연결을 허용하도록 구성되어 있는지 확인하십시오. (공급자 : 명명 된 파이프 공급자, 오류 : 40-SQL Server에 대한 연결을 열 수 없음)


올바른 서버에 연결하고 있습니까? 오류는 일반적인 SQL Server / Express 예외입니다. Sql CE 데이터베이스에 연결되어있는 것 같지 않습니다. EF Code는 데이터베이스가 존재하지 않는 경우 먼저 생성합니다 ... 경로를 찾을 수없는 경우 ...
Steven K.

따라서 기본적으로 OP의 실수는 전체 연결 문자열을 이름 대신 DbContaxt 생성자에 보내는 것이 었습니다. 문서에 따르면 "DbContext (String) 데이터베이스의 이름 또는 연결 문자열로 주어진 문자열을 사용하여 새 컨텍스트 인스턴스를 생성합니다."
Göran Roseen

답변:


86

여기서 게임에 조금 늦었지만 다른 옵션은 다음과 같습니다.

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

2
안녕하세요! 이것은 나를 어딘가로 데려 간 유일한 해결책이었습니다. 내 문제는 web.config 대신 Azure 구성 파일에서 설정을 가져오고 싶다는 것입니다. 그래도이 방법은 '공급자'설정이 누락 되었기 때문에 작동하지 않습니다 (web.config의 속성으로 설정 됨). 어떤 아이디어?
사용자

1
훌륭한 대답입니다! 유일한 변경 사항은 connString 매개 변수를 제거한 다음 응용 프로그램 설정에 저장된 연결 문자열을 사용하는 것입니다 .... this.Database.Connection.ConnectionString = Properties.Settings.Default.ConnectionString
usefulBee

connString과 DbCompiledModel 객체를 동시에 매개 변수로 전달하려면 어떻게해야합니까?
베 자드 에브라

좋은. "this"는 중복되며 제거 할 수 있습니다.
tocqueville

1
클래스 모듈 Manual changes to this file will be overwritten if the code is regenerated.이 헤더에 포함 된 경우 부분 클래스 및 메서드 (C # 프로그래밍 가이드)
woodvi

59

문서를 읽은 후 대신 연결 문자열의 이름을 전달해야합니다.

var db = new NerdDinners("NerdDinnerDb");

내 생성자에 넣고 다른 곳에서 참조해야 할 경우를 대비하여 공개 상수로 만들었습니다.
Tony Wall

37

"DbContext에 연결 문자열을 전달하는 방법"을 찾는 사람들을 위해이 비트를 추가 할 것이라고 생각했습니다. 기본 데이터 저장소에 대한 연결 문자열을 생성하고 전체 연결 문자열을 DbContext에서 파생 된 유형의 생성자에 전달할 수 있습니다. .

(@Lol Coder의 코드 재사용) 모델 및 컨텍스트

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

4
연결 문자열을 정말 하드 코딩하기 위해 다음을 수행했습니다.public TestAppContext() : base("Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True") { }
Elijah W. Gagne

28

DbContext에서 DbContext에 대한 기본 생성자를 만들고 다음과 같이 기본을 상속합니다.

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

1
제 경우에는 MyConnectionString... 라는 DB를 생성합니다 (예 : 연결 문자열이 있음). 나는 넣어야한다 name=MyConnectionString.
Matthieu Charbonnier

2

앱 내에서 연결 문자열을 구성하는 경우 connString 명령을 사용합니다. 웹 구성에서 연결 문자열을 사용하는 경우. 그런 다음 해당 문자열의 "이름"을 사용합니다.


2

그 문제에 대한 약간의 솔루션 예가 있습니다.

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"


연결 문자열은 둘 다 동일한 프로젝트에서 동일한 이름을 사용할 때 작동합니다.
Shawn Mclean 2011 년

내가 수동으로 DbConext에 전달하고자 할 때 그것은 작동하지 않습니다
숀 맥클린

연결 문자열은 괜찮으며 경로가 절대적 일 필요는 없습니다.
Steven K.

1

EF 모델을 사용할 때 EF 모델을 사용하는 각 프로젝트에 연결 문자열이 있습니다. 예를 들어, 별도의 클래스 라이브러리에 EF EDMX 모델이 있습니다. 내 웹 (mvc) 프로젝트에 하나의 연결 문자열이 있으므로 EF db에 액세스 할 수 있습니다.

리포지토리 테스트를위한 또 다른 단위 테스트 프로젝트도 있습니다. 리포지토리가 EF db에 액세스하려면 테스트 프로젝트의 app.config 파일에 동일한 연결 문자열이 있습니다.

DB 연결은 코딩되지 않고 IMO로 구성되어야합니다.


2
코드로 연결 문자열을 수동으로 전달해야합니다. 종속성 주입을 사용하고 있습니다.
Shawn Mclean 2011 년

1

에서 여기

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["BloggingDatabase"].ConnectionString);
    }

추가해야 할 수도 있습니다. Microsoft.EntityFrameworkCore.SqlServer


0

코드에 문제가있는 것을 볼 수 없습니다. SqlExpress를 사용하고 생성자에서 연결 문자열을 사용할 때 제대로 작동합니다.

프로젝트에 App_Data 폴더를 만들었습니다. 그렇지 않습니까?


0

여기에 온 사람은 연결 문자열을 동적으로 설정하는 방법을 알아보고 위의 솔루션 (예 : "초기화 문자열의 형식이 인덱스 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)
{
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.