2

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

4

1 回答 1

1

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

MSDN:DbContext 包装了 ObjectContext,并通过使用简化和更直观的 API 公开了 ObjectContext 最常用的功能。每当您需要使用 DbContext 不支持的功能时,您都可以访问底层 ObjectContext。

于 2013-03-12T11:35:54.787 回答