2011-06-10 4 views
3

나는 왜 내가 기본 엔티티 비교자를 작동하지 않는지에 대해 물어 보았다.EF DbContext 및 Ninject

EF Code First - Linq to Entities Union EqualityComparer

대답은 내 DbContext 따라서 다른 참고 문헌이 개 차이 인스턴스를 사용했다는 사실 때문이었다.

이제 요청을 통해 내 DbContent를 공유하려고합니다. 몇 가지 "복잡한"예제가 있지만 좀 더 간단한 솔루션을 찾으려고한다고 생각했습니다. 나는이 내 두 저장소에서 다음

public class SiteContext : DbContext, IDbContext { 
    public DbSet<News> News { get; set; } 
    public DbSet<Category> Categories { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     ... 
    } 
} 

(NewsRepository 및 CategoryRespository) :

그래서 나는

public interface IDbContext { 
    int SaveChanges(); 
    DbSet<News> News { get; set; } 
    DbSet<Category> Categories { get; set; } 
} 

내 DbContext는 다음과 같이 구현되어 단순히 내 엔티티를 요약합니다 IDbContext 인터페이스를 생성 IDbContext를 생성자 매개 변수로 사용

IDbContext _db; 

public NewsRepository(IDbContext db) { 
    _db = db; 
} 

이제 요청 범위에서 SiteContext에 IDbContext를 바인딩하면 저장소가 동일한 컨텍스트를 공유한다고 가정합니다.

kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope(); 

그러나 이전 질문에서 내 유니언을 다시 시도 할 때 여전히 중복 엔티티가 수신됩니다! 내가 뭘 잘못하고 있니? 한 요청에서 동일한 문맥을 확실히 사용하고 있는지 어떻게 알 수 있습니까?

+0

컨텍스트의 생성자에 중단 점을 설정할 수 있습니까? 나는 같은 접근 방식을 사용하고 있으며 정확히 당신처럼 요청 당 컨텍스트를 사용하고 있습니다. – Gluip

답변

4

각 저장소가 구성 될 때 Ninject will은 저장소마다 SiteContext의 새로운 인스턴스를 제공하기 때문에. 그게 왜 작동하지 않습니다. 모든 저장소가 동일한 컨텍스트를 사용한다는 것을 의미하는 단위 작업 구현을 사용하는 것이 좋습니다.
UnitOfWork는 생성시 IDbContext를 사용합니다.

[Inject] 
public INewsRepository NewsRepo {get;set;} 

IUnitOfWork가 생성 될 때마다이 :

이 같은 일부 것은 아직도 Ninject에 함께 INewsRepository의 속성 주입을 할 것 feanz의 솔루션을 개선하기 위해

private IDbContext _context; 

public UnitOfWork(IDbContext context) 
{ 
    _context = context 
} 

private _INewsRepository; 
public INewsRepoitory 
{ 
    get{ 
     if(_INewsRepository == null) 
     { 
       _INewsRepository = new NewsREpository(_context); 
       return _INewsRepository; 
     } 
     else 
     { 
       return _INewsRepository; 
     }  
} 
-1

를 작동합니다 또한 INewsRepository가 생성되었습니다. 이것은 여전히 ​​귀하의 ninject 바인딩에 추가되어야합니다.

관련 문제