2

我有以下情况:

我从这里使用 EF 和存储库模式和工作单元

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

在此处输入图像描述

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

在此处输入图像描述

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

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

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

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);

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

如果您需要任何其他代码或参考,请告诉我。

4

1 回答 1

1

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

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

于 2013-08-16T20:39:27.630 回答