有没有办法在删除之前检查所有包含导航 - Entity Framework
is there a way to check All include navigation befor remove - Entity Framework
我有一个 User
class 有 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...
}
最后,为您的实体创建一个扩展 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());
}
}
我有一个 User
class 有 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...
}
最后,为您的实体创建一个扩展 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());
}
}