我在刷新数据库中的数据时遇到问题。请参阅下面的代码。我在这里尝试完成的是:我创建一个ProductProtocol(p)并将一个ProductProtocolContent添加到ProductProtocolContents列表中。然后我将整个数据保存到数据库中。之后,我模拟了我想要撤消的更改(添加了另一个ProductProtocolContent),我想在使用我的存储库刷新对象后测试它
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);
我的问题是,在调用Assert.IsTrue时,p.ProtocolContents.Count == 0。
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();
}
使用Entity Framework 4(使用ObjectContext而不是DbContext)我只是做了这个并且有效:
context.LoadProperty(target, spec, MergeOption.OverwriteChanges);
如何使用DbSet执行此操作,必须转换回ObjectContext还是DbSet的等效项?
答案 0 :(得分:1)
如果您无法在DBContext上执行此操作,则始终可以转换为ObjectContext并使用其功能。
MSDN:DbContext包装ObjectContext并使用简化和更直观的API公开ObjectContext最常用的功能。只要需要使用DbContext不支持的功能,就可以访问底层的ObjectContext。