有没有办法在删除之前检查所有包含导航 - Entity Framework

is there a way to check All include navigation befor remove - Entity Framework

我有一个 User class 有 50 个导航属性(一对多)。例如:

user>>post , user >> files , ...

UserServiceLayerDelete 操作中,我想在删除用户之前检查所有用户 navigation Properties 并且如果其中至少一个大于零 (0),则会无权删除。

我有SoftDelete.

我不想使用 If 块来检查所有导航。

有办法检查吗?或者我应该使用 If 语句。

我会选择这样的东西:

public class User
{
    public int Id { get; set; }
    public bool IsDeleted { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
    public virtual ICollection<File> Files { get; set; }
    // etc...

    public bool CanDelete()
    {
        return !Posts.Any() &&
               !Files.Any(); // &&
               // etc... 
    }
}

这将保留确定实体是否允许删除的逻辑,您可以在其中更轻松地查看所涉及的属性。

您仍然需要在 UserServiceLayer 中使用 if 语句,但这将是一个非常简单的 if 语句。


要制作此通用版本,一种方法是使用自定义属性和扩展方法,该方法使用反射循环遍历标有该属性的所有属性。

像这样定义属性:

[AttributeUsage(AttributeTargets.Property)]
public class MustBeEmptyToDeleteAttribute : Attribute { }

将属性添加到实体的属性中,如下所示:

public class User
{
    public int Id { get; set; }
    public bool IsDeleted { get; set; }

    [MustBeEmptyToDelete] public virtual ICollection<Post> Posts { get; set; }
    [MustBeEmptyToDelete] public virtual ICollection<File> Files { get; set; }
    // etc...
}

最后,为您的实体创建一个扩展 class:

public static class EntityExtensions
{
    public static bool CanDelete(this object entity)
    {
        return entity.GetType().GetProperties()
            .Where(x => x.IsDefined(typeof(MustBeEmptyToDeleteAttribute)))
            .Select(x => x.GetValue(entity))
            .OfType<IEnumerable<object>>()
            .All(x => !x.Any());
    }
}