난 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가 개선되지 않았습니까? 이 문제에 어떻게 접근 할 수 있을지에 대한 제안 사항이 있으십니까?