2013-03-12 3 views
2

데이터베이스에서 데이터를 새로 고치는 데 문제가 있습니다. 아래 코드를 참조하십시오. 여기서 내가 시도하고자하는 것은 ProductProtocol (p)을 만들고 ProductProtocolContent 목록에 하나의 ProductProtocolContent를 추가합니다. 그런 다음 전체 데이터베이스를 데이터베이스에 저장합니다. 그 후 나는 내가 할 (다른 ProductProtocolContent의 추가) 내가 취소하려면 그와 저장소 (repository)에 사용데이터베이스에서 강제로로드 탐색 속성

var p = new ProductProtocol { Name = "test1" }; 

p.ProtocolContents.Add(new ProductProtocolContent { ValidFrom = DateTime.Now, Value = "9_qwe2341" }); 

var r = RepositoryFactory.Create<ProductProtocol>(unitOfWork); 
r.Add(p); 
unitOfWork.Commit(); 

// add another ProductProtocolContent, p.ProductProtocolContents.Count == 2 
p.ProtocolContents.Add(new ProductProtocolContent { ValidFrom = DateTime.Now, Value = "9_truf7461" }); 

// undo the changes to the object 
r.Refresh(p); 

// reload the ProductProtocolContents from the database 
r.LoadPropertySet(p, pc => pc.ProtocolContents); 

// p.ProductProtocolContents.Count should be 1 
Assert.IsTrue(p.ProtocolContents.Count == 1); 

내 문제를 객체를 새로 고침 한 후 그 다음 검사 할 변화를 시뮬레이션하면 해당 p.ProtocolContents.Count입니다 == 0 Assert.IsTrue가 호출 될 때. 다음과 같이

r.LoadPropertySet (구현)입니다 :

public void LoadPropertySet<Y>(T target, Expression<Func<T, ICollection<Y>>> spec) where Y : BaseBusinessObject 
{ 
    context.Entry(target).Collection(spec).CurrentValue.Clear(); 
    context.Entry(target).Collection(spec).Load(); 
} 

는 단순히 이런 짓을 (대신 DbContext의 ObjectContext를 사용) 엔티티 프레임 워크 4를 사용하고 그 일 :

context.LoadProperty(target, spec, MergeOption.OverwriteChanges); 

DbSet을 사용하여이 작업을 수행하려면 어떻게해야합니까? ObjectContext로 다시 변환해야합니까? 아니면 DbSet에 해당하는 것이 있습니까?

답변

1

DBContext에서 수행 할 수없는 경우 항상 ObjectContext로 캐스팅하고 해당 기능을 사용할 수 있습니다.

MSDN : DbContext는 ObjectContext를 래핑하고 단순하고 직관적 인 API를 사용하여 ObjectContext에서 가장 일반적으로 사용되는 기능을 제공합니다. DbContext에서 지원하지 않는 기능을 사용해야 할 때마다 기본 ObjectContext에 액세스 할 수 있습니다.

+0

나는 그렇게 생각한다. 그러나 내가 그것을하기 전에 나는 내가 무엇인가 멀리 바라 보지 않도록하고 싶다. –