2011-08-18 2 views
0

이것은 처음에는 EF 코드와 관련된 단순한 것이어야하지만 필자가 찾던 모든 예제는 이전 버전의 것입니다. 나는 최신 (4.1)과 함께 일하고있다.두 개의 DbContext가있는 EF 코드

public class Foo 
{ 
    public int ID { get; set; } 
    public Bar Bar { get; set; } 
} 

public class Bar 
{ 
    public int ID { get; set; } 
    public string Value { get; set; } 
} 

내가 내 컨트롤러/저장소를 만들 Asp.Net MVC와 일부 비 계를 사용하고 난 '푸'객체를 생성 할 때, 그것은 또한 '바'작성 ​​: 어쨌든

나는 일부 모델 같은이 비록 내가 데이터베이스에 저장된 무언가로부터 '막대기'속성을 설정하더라도 개체.

public class FooViewModel 
{ 
    public int ID { get; set; } 
    public int BarID { get; set; } 
} 

public ActionResult Create(FooViewModel foo) 
{ 
    var entity = new Foo() 
     { 
      ID = foo.ID, 
      Bar = _barRepository.Find(foo.BarID) 
     }; 
    _fooRepository.InsertOrUpdate(entity); 
    _fooRepository.Save(); 
    // more stuff 
} 

EF에 유창한 구문을 사용하여 데이터베이스에 새로운 '막대'행을 만드는 것을 중지하려면 어떻게해야합니까?

업데이트 여기

생성 된 저장소 코드 :

public void InsertOrUpdate(Foo foo) 
    { 
     if (foo.ID == default(int)) { 
      // New entity 
      context.Foo.Add(foo); 
     } else { 
      // Existing entity 
      context.Foo(foo).State = EntityState.Modified; 
     } 
    } 

    public void Save() 
    { 
     context.SaveChanges(); 
    } 
+1

'_fooRepository'와'_barRepository'는 동일한 DB 컨텍스트 인스턴스를 공유합니까? –

+0

Doh ... 예, 그게 문제였습니다. 나는 마술적인 EF 엔티티 트래킹 대신 Bar 오브젝트의 프라이 머리 키를 볼 것이라고 생각했다. 또한, 나는 두 개의 저장소가 문맥을 공유 할 것이라고 생각했다. IOC를 추가 할 때이를 설정하기도합니다. 네가 원한다면 너는 그 대답을 할 수있어서 내가 이것을 닫을 수있다. –

답변

2

_fooRepository와 _barRepository는 동일한 DB 컨텍스트 인스턴스를 공유해야합니다. 두 인스턴스를 사용하는 경우 Bar이 추가 상태가됩니다.

0

문제는 저장소 계층에서 어딘가에 있어야합니다 - 직접 EF 4.1과 같은 모델을 사용하여이 예상되는 결과를 생성 - 새가 기존 행을 가리키는 bar FK 열이있는 Foos 테이블의 행.

+0

저장소 코드를 포함하도록 게시물을 업데이트했습니다. –