gpt4 book ai didi

asp.net-mvc - 具有软删除功能的通用存储库

转载 作者:行者123 更新时间:2023-12-04 00:26:47 27 4
gpt4 key购买 nike

我有一个通用的存储库实现。我正在使用 asp.net mvc c#,代码优先 Entity Framework 。

我创建了一个名为 ISoftDelete 的接口(interface):

public interface ISoftDelete
{
bool IsDeleted { get; set; }
}

我在我的基础存储库中实现了 Delete 和 GetById,如下所示:
    public virtual void Delete(T entity)
{
if (entity is ISoftDelete)
{
((ISoftDelete)entity).IsDeleted = true;
}
else
{
dbset.Remove(entity);
}
}

public virtual T GetById(long id)
{
T obj = dbset.Find(id);
if (obj is ISoftDelete)
{
if (((ISoftDelete)obj).IsDeleted)
return null;
else
return obj;
}
else
{
return obj;
}
}

现在,我有 2 个问题。

1)这种方法是一种好方法吗?任何与性能相关的问题?

2)我在基础存储库中的原始 GetAll 函数是这样的:
    public virtual IEnumerable<T> GetAll()
{
return dbset.ToList();
}

当 T 从 ISoftDelete 派生时,我应该如何修改它以列出 IsDeleted == false 的记录?

谢谢!

最佳答案

1) 检查 if (entity is ISoftDelete) 似乎不行每次你需要知道它。如果您确定不会在其他任何地方检查它,那可能没问题。就性能而言,如果您消除具有 IsDeleted == true 的记录会更好。永远不要从数据库中获取它们。您可能需要派生一个新的基础存储库,它会覆盖这些方法并为 ISoftDelete 对象实现新逻辑。

public abstract class BaseRepository<T>
{
// protected dbset;

public virtual void Delete(T entity)
{
dbset.Remove(entity);
}

public virtual T GetById(long id)
{
return dbset.Find(id);
}

public virtual IEnumerable<T> GetAll()
{
return dbset.ToList();
}
}

public abstract class SoftDeleteRepository<T> : BaseRepository<T> where T : ISoftDelete
{
public override void Delete(T entity)
{
entity.IsDeleted = true;
}

public override T GetById(long id)
{
return (from t in dbSet
where !t.IsDeleted && t.Id == id select t)
.FirstOrDefault();
}

public override IEnumerable<T> GetAll()
{
return (from t in dbset where !t.IsDeleted select t).ToList();
}
}

public static class RepositoryFactory
{
public static BaseRepository<T> GetInstance<T>()
{
// pseudo code
if (typeof(T) implements ISoftDelete)
return repository of T which extends SoftDeleteRepository
return repository of T which extends BaseRepository
}
}

2) 可能类似于
 return (from t in dbset  where 
(t is ISoftDelete && !(t as ISoftDelete).IsDeleted) ||
!(t is ISoftDelete))
.ToList();

关于asp.net-mvc - 具有软删除功能的通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com