2

먼저 엔티티 프레임 워크 코드를 사용하여 리포지토리 패턴을 구현하려고합니다. rc 1. DbContext를 만드는 데 문제가 있습니다. IROCOSitory를 해결하는 ioc 컨테이너가 있고 windsor.config 파일에 연결 문자열이있는 새로운 DbContext를 뉴스로 제공하는 contextprovider가 있습니다. linq2sql에서이 부분은 아무 문제가 없었지만 EF는 질식하는 것 같습니다. 아래 문제를 예제로 설명하겠습니다. 조금 단순화하기 위해 코드를 뽑아 냈습니다. 그래서 여기서 저장소 패턴을 볼 수 없습니다. 모든 여분의 코드와 클래스가 없으면 어떤 일이 일어나는지 바로 알 수 있습니다.Entity Framework RC1 DbContext 쿼리 문제

  using (var context = new PlssContext()) 
      { 
       var x = context.Set<User>(); 
       var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault(); 
      } 

      using (var context2 = new DbContext(@"Data Source=.\SQLEXPRESS;Initial Catalog=PLSS.Models.PlssContext;Integrated Security=True;MultipleActiveResultSets=True")) 
      { 
       var x = context2.Set<User>(); 
       var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault(); 
      } 

PlssContext는 내 DbContext 클래스를 생성합니다. 저장소 패턴은 PlssContext에 대해 아무것도 모릅니다. 내가 할 수있는 최선의 생각은 sqlexpress 데이터베이스에 대한 연결 문자열로 DbContext를 생성하고 그런 식으로 데이터를 쿼리하는 것입니다. var context2의 연결 문자열은 PlssContext 객체를 새로 작성한 후 컨텍스트에서 가져옵니다. 그래서 그들은 같은 sqlexpress 데이터베이스를 가리키고 있습니다.

첫 번째 쿼리가 작동합니다. 두 번째 쿼리가이 오류와 함께 비참하게 실패

The model backing the 'DbContext' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

이 줄을 다음

var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault(); 

에 대한 것은 내 DbContext입니다

namespace PLSS.Models 
{ 
    public class PlssContext : DbContext 
    { 
     public DbSet<User> Users { get; set; } 
     public DbSet<Corner> Corners { get; set; } 
     public DbSet<Lookup_County> Lookup_County { get; set; } 
     public DbSet<Lookup_Accuracy> Lookup_Accuracy { get; set; } 
     public DbSet<Lookup_MonumentStatus> Lookup_MonumentStatus { get; set; } 
     public DbSet<Lookup_CoordinateSystem> Lookup_CoordinateSystem { get; set; } 

     public class Initializer : DropCreateDatabaseAlways<PlssContext> 
     { 
      protected override void Seed(PlssContext context) 
      { 

저도 같은 오류로 초기화 모든 전략을 시도했습니다 . 나는 데이터베이스가 바뀌고 있다고 생각하지 않는다. 나는 그런 오류가 반환하는

 modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 

을 제거하면 종류의 의미가

The entity type User is not part of the model for the current context.

입니다. 그러나 어떻게이 모든 것을 하나로 모으고 있습니까?

답변

4

올바른 동작입니다. 일반 DbContext은 매핑에 대해 전혀 모릅니다 (= 엔티티를 알지 못함). 이것이 파생 된 컨텍스트를 항상 만들어야하는 이유입니다. 귀하의 저장소에 대한 PlssContext 몰라하지만 당신은 여전히 ​​좋아 주입 할 수 있습니다 첫 번째 코드를 사용하는 경우 직접 기본 DbContext 인스턴스를 사용할 수 없습니다

public class Repository 
{ 
    private readonly DbContext _context; 

    public Repository(DbContext context) 
    { 
    _context = context; 
    } 
    ... 
} 

var repository = new Repository(new PlssContext()); 

.

+0

코드 첫 번째 방법을 사용하지 않은 경우 연결 문자열 작업을 사용 하시겠습니까? 데이터베이스가 생성 된 후에도 연결 문자열과 함께 DbContext를 사용하여 원하는 것을 수행 할 수 없습니까? – Steve

+0

연결 문자열이 아닙니다. 이것은 컨텍스트의 구성에 관한 것이며 구성은 기본 클래스가 아닌 파생 클래스에 의해 정의됩니다. 'PlssContext'를 사용해야합니다. –

+0

윈저를 사용하여 컨텍스트를 전달하는 방법을 조사해야합니다. 그냥 구성 요소로 추가 할 수 있다고 생각합니다. 나는 당신이 그것을 당신의 예제에서 하드 코딩 한 방법을 좋아하지 않는다. – Steve

관련 문제