实体框架从上下文重新加载实体

时间:2013-08-16 19:38:24

标签: entity-framework

我有以下情况:

我在 here

中使用EF与存储库模式和工作单元

然后我扩展了我的部分类并创建了一个具有GetAll和其他方法的Finder类。 您可以在下面看到:

enter image description here

下面你可以看到我正在使用一个工作类单元和所有类的存储库来从通用存储库中获取实例:

enter image description here

protected Repository<Category> _CategoryRepository;
public Repository<Category> CategoryRepository
{
    get { return _CategoryRepository ?? (_CategoryRepository = new Repository<Category>(context)); }
}

因此,通过这种方式,我有了不同的存储库,当从db获取实体并从不同的上下文更新它时会导致问题。因此,我使用 this 方法用于上下文生命周期管理。它解决了这个问题。

现在我面临的问题是以下代码:

var cat = Instance.Category.GetSingle(c => c.CategoryID == 7);

var orignal = cat.CategoryName;

var expected = cat.CategoryName + " Test Catg Update";

cat.CategoryName = expected;

cat.Update(); //This doesn't actually update due to a validation in place (which is correct)

cat = Instance.Category.GetSingle(c => c.CategoryID == 7);

Assert.AreEqual(cat.CategoryName, expected);

当我使用Update时,我有一些验证器,并且更新失败(例如由于字符串的大小超过15个字符)。当我再次尝试调用GetSingle(上面代码的第二行)时,它会给我带来相同的旧记录,即[cat.CategoryName +“Test Catg Update”]。这是正常的方式吗?如果不能解决,我可以从数据库重新加载对象。

如果您需要任何其他代码或参考,请与我们联系。

1 个答案:

答案 0 :(得分:1)

Update()方法中,如果验证失败,只需将实体的状态设置为EntityState.Unchanged即可。在幕后,将实体的状态从Modified更改为Unchanged会首先将所有属性的值设置为查询时从数据库中读取的原始值,然后将实体标记为Unchanged。这也将拒绝对FK关系的更改,因为将恢复FK的原始值。

您也可以利用ObjectContext.Refresh()方法来处理这个问题。但是,这是在ObjectContext上,因此您需要一种方法来在您的UoW中处理它。刷新方法类似于context.Refresh(RefreshMode.ServerWins, entity);