코드 우선 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.