使用实体框架的通用存储库,我如何查询实现特定接口的实体
本文关键字:实体 查询 实现 接口 存储 框架 何查询 | 更新日期: 2023-09-27 17:59:39
我正在使用实体框架的Repository模式,并实现了一个通用存储库。
不过,对于某些类型的实体,如果要将IsDeleted
布尔设置为true,我不想从数据库中删除该记录。
为此,我创建了一个简单的界面:
IEntityProtectedDelete.cs
public interface IEntityProtectedDelete
{
bool IsDeleted { get; set; }
}
Is在我的实体上实现如下:
队列.cs
public class Queue : IEntityProtectedDelete
{
public Queue()
{
IsDeleted = false;
}
[Key]
public int QueueId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public bool IsDeleted { get; set; }
}
下面是我正在使用的通用存储库的一部分。Delete
方法按预期工作,并在使用上述Interface时将IsDelete
属性设置为true。
但是,如果实体实现IEntityProtectedDelete
,我不太清楚如何正确地查询数据库。
GenericRepository.cs
public class GenericRepository<T> where T : class
{
protected DBContext context;
protected IDBSet dbSet;
public GenericRepository(IContext context)
{
this.context = context;
this.dbSet = context.Set<T>();
}
public virtual void Delete(T entity)
{
dbSet.Attach(entity);
if (entity is IEntityProtectedDelete)
{
(entity as IEntityProtectedDelete).IsDeleted = true;
context.Entry(entity).State = EntityState.Modified;
}
else { dbSet.Remove(entity); }
}
public virtual IEnumerable<T> GetAll()
{
if (typeof(IEntityProtectedDelete).IsAssignableFrom(typeof(T)))
{
return context.Set<T>().OfType<IEntityProtectedDelete>().Where(e => e.IsDeleted == false).ToList() as IEnumerable<T>;
}
else { return context.Set<T>().ToList(); }
}
}
在GetAll()方法中,OfType<>
抛出异常:
'IEntityProtectedDelete' is not a valid metadata type for type filtering operations. Type filtering is only valid on entity types and complex types."
如果这不起作用,我还有什么其他选择?
已经在SO上讨论了实体框架的软删除模式,此处介绍了可接受的解决方案
http://www.wiktorzychla.com/2013/10/soft-delete-pattern-for-entity.html
诀窍是将IsDeleted
定义为鉴别器列,以便EF自动附加筛选子查询。