【问题标题】:ValidateEntity in Entity Framework not called on Delete of entry删除条目时未调用实体框架中的 ValidateEntity
【发布时间】:2013-08-06 15:05:56
【问题描述】:

我有一个复杂的类(参见下面的示例代码),我保存在 Entity Framework Code First 数据库 (V5) 中。问题是如果在保存到数据库的 FooAndOrBar 数据中使用了 FooClass,我想阻止 FooClass 条目被删除。因为它可能为空,所以外键检查不会阻止 FooClass 被删除,所以我必须检查自己。

    class FooClass { ... some properties }

    class BarClass { ... some properties }

    class FooAndOrBar
    {
        public int Id { get; set; }
        public FooClass Foo { get; set; }
        public BarClass Bar { get; set; }
    }

因此,遵循验证跨越多个数据库条目的条目的良好做法,我向 Entity Framework 的 ValidateEntity 方法添加了一个测试,如下所示。

    protected override DbEntityValidationResult ValidateEntity(
        DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        if (entityEntry.Entity is FooClass && 
            entityEntry.State == EntityState.Delete)
        {               
            if (... entityEntry.Entity is used in DbContext.FooAndOrBars ...)
                return new DbEntityValidationResult(... error ...);
        }

        return base.ValidateEntity(entityEntry, items);

    }

问题是在删除时似乎没有调用 ValidateEntity。这是有道理的(为什么要验证您要删除的东西),但给我留下了我应该把支票放在哪里的问题?我确实使用了 UnitOfWork/repository 模式,并且可以在其中进行测试,但那很臭。

有没有其他人遇到过这个问题并以干净的方式解决了它?您的意见将不胜感激。

Pawel 的回答(见下文)。

@pawel 指出您可以覆盖 ShouldValidateEntity 以便为已删除的项目调用 ValidateEntity。以下是一些示例代码,以防其他人觉得这很有用。

/// <summary>
/// Override ShouldValidateEntity to cause deleted entities to be checked as well
/// </summary>
protected override bool ShouldValidateEntity(DbEntityEntry entityEntry)
{
    if (entityEntry.State == EntityState.Deleted)
        return true;

    return base.ShouldValidateEntity(entityEntry);
}

实际上,我通过检查实体的类型使检查比只检查所有已删除的项目更严格,但这只是为了提高性能。

【问题讨论】:

  • 一开始它让我想到了控制器中的删除操作。

标签: .net entity-framework ef-code-first


【解决方案1】:

默认情况下,仅验证修改和添加的实体。这可以通过重写 DbContext.ShouldValidateEntity() 方法来更改,以便对已删除的实体也返回 true。

【讨论】:

  • 嗨@pawel。这正是我所需要的,而且效果很好。我可以在 DbContext 中的代码中进行测试以跟踪更改,但是混合验证和跟踪,这不是一个聪明的主意。我在答案中包含了示例代码。
  • 很高兴它对您有用,并感谢您添加代码以显示解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多