2013-08-07 2 views
0

난 POCO 클래스가 있는데, 이들은 TPT (Table per Type) 전략을 사용하여 Fluent API를 사용하여 매핑됩니다.일대 다 자손으로 파생 된 엔티티 업데이트

public class Base 
{ 
    ... 
} 

public class Derived : Base 
{ 
    ... 
    public virtual ICollection<Foo> Foos {get; set;} // One-to-Many 
} 

public class Foo 
{ 
    ... 
    public virtual ICollection<Bar> Bars {get; set;} // One-to-Many 
} 

public class Bar 
{ 
    ... 
} 

내 저장소는 다음과 같습니다.

public class Repo 
{ 
    public void Update(Base item) 
    { 
     using (var ctx = new DbContext()) 
     { 
     ctx.Entry(item).State = EntityState.Modified; 
     ctx.SaveChanges(); 
     } 
    } 
} 

작업 : I 만 Base 또는 Derived 클래스를 통해 업데이트하는 경우

public void DoStuff() 
{ 
    Derived item = repo.GetById(1); 
    item.SomeProp = "xyz"; // new value 
    item.Foos = GenerateFoosWithBars(); // change children 
    repo.Update(item); 
} 

놀랍게도 Update으로 실제로 작동합니다. 그러나 일대 다 관계를 업데이트하려고하면 일이 추악 해집니다. EF4에서 tutorial on how to Update One-to-Many Entities을 찾았습니다. 정말 EF가 더 똑똑해지기를 기대했는데, 수동으로해야한다는 것을 의미합니다 ... EF의 다른 모든 것들과 너무 다릅니다.

Entry을 사용하기 시작 했으므로 Base 파생 클래스를 업데이트 할 수있는 일반형 이었기 때문에 Entry.OriginalValues을 사용하여 직접 쿼리를 작성하지 않아도되었습니다. 하지만 지금은 정말 팬들을 때리고! Entry.OriginalValues이 (가) DbSet<Derived>이라는 예외와 함께 실패합니다. 그것은 완전히 맞습니다. 하지만 Derived은 상속을 통해 DbSet<Base>에 매핑되어서는 안됩니다.

나는이 문제에 대해 유용한 것을 찾을 수 없어서 분명히 뭔가 잘못하고 있거나 다른 모든 사람들과 다른 것을하고있을 것입니다. 어쨌든 EF5가 개선되지 않았습니까? 이 문제에 어떻게 접근 할 수 있을지에 대한 제안 사항이 있으십니까?

답변

0

첫째, EF가 변경 사항을 추적하고 컨텍스트에서 SaveChanges()를 호출 할 때 적용되므로 Update 메서드가 저장소에 필요하지 않다고 생각합니다. 둘째로, 문제는 당신이 할 때 Foos poperty에 새로운 콜렉션을 할당하는 것일 수 있습니다 : item.Foos = GenerateFoosWithBars(); EF가 파생 된 유형의 객체를 구체화 할 때 가상 Foos 컬렉션을 오버라이드하는 프록시를 반환하기 때문에 추적하는 특수한 종류의 지연로드 된 컬렉션을 사용하기 때문에 그렇게해서는 안됩니다. 컨텍스트에 바인딩되지 않는 다른 컬렉션을 할당하는 경우 (나는 EF가 그것을 아주 잘 처리 할 것이라고 생각하지 않는다). 컬렉션 자체가 아니라 컬렉션 항목을 수정하면됩니다. 희망이 도움이됩니다!

관련 문제