强制从数据库重新加载导航属性

时间:2013-03-12 11:31:12

标签: entity-framework entity-framework-5

我在刷新数据库中的数据时遇到问题。请参阅下面的代码。我在这里尝试完成的是:我创建一个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的等效项?

1 个答案:

答案 0 :(得分:1)

如果您无法在DBContext上执行此操作,则始终可以转换为ObjectContext并使用其功能。

MSDN:DbContext包装ObjectContext并使用简化和更直观的API公开ObjectContext最常用的功能。只要需要使用DbContext不支持的功能,就可以访问底层的ObjectContext。