有没有办法检查所有包括导航删除 - 实体框架

本文关键字:删除 导航 实体 框架 包括 检查 有没有 | 更新日期: 2023-09-27 18:33:36

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

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

UserServiceLayer Delete操作中,我想在删除用户之前检查所有用户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...
}

最后,为实体创建一个扩展类:

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