有没有办法检查所有包括导航删除 - 实体框架
本文关键字:删除 导航 实体 框架 包括 检查 有没有 | 更新日期: 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());
}
}