使用实体框架的通用存储库,我如何查询实现特定接口的实体

本文关键字:实体 查询 实现 接口 存储 框架 何查询 | 更新日期: 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自动附加筛选子查询。