c# - 使用 EF 中的通用方法检查数据库中是否存在记录

标签 c# asp.net asp.net-mvc entity-framework generics

<分区>

我正在开发一个 Asp.Net MVC 应用程序,并尝试创建一个通用方法,通过使用传递给此方法的 entityId 来检查数据库中是否存在特定记录。如下所示:

public bool CheckIfUserExistsByUserId(int userId)
{
    return _userRepository.DbSet().Any(u => u.Id == userId);
}

但此方法仅检查 _userRepository 并接受一个整数作为 entityId。

我的问题是我想把这个通用方法作为通用方法放在我的 BaseService 中,就像我在下面写的其他通用方法一样:

public class BaseService<TModel> : IBaseService<TModel> where TModel : class
{
    private readonly IUnitOfWork _unitOfWork;
    private readonly IBaseRepository<TModel> _baseRepository; 

    public BaseService(IUnitOfWork unitOfWork, IBaseRepository<TModel> baseRepository)
    {
        _unitOfWork = unitOfWork;
        _baseRepository = baseRepository;
    }

    public BaseService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public void Add(TModel entity)
    {
        this._baseRepository.Add(entity);
    }

    public void Remove(TModel entity)
    {
        this._baseRepository.Remove(entity);
    }

    /// <summary>
    /// Remove All Provided Items At Once .
    /// </summary>
    /// <param name="itemsToRemove"></param>
    public void RemoveRange(IEnumerable<TModel> itemsToRemove)
    {
        _baseRepository.RemoveRange(itemsToRemove);
    }

    public TModel FindById<T>(T key)
    {
        return _baseRepository.FindById(key);
    }

    public void Commite()
    {
        this._unitOfWork.Commite();
    }
}

但在这种情况下,我无法从 Entity Framework 中获取传递给我的方法的实体的主键字段。另外,我不想在我使用上述方法的任何地方都将实体的主键字段传递给我的方法。 EF中是否可以获取到实体的主键字段?

编辑:根据其他用户的要求,我在此处添加了我的 IBaseRepository 源代码:

public interface IBaseRepository<TModel> where TModel : class
{
    /// <summary>
    /// Add New Entity .
    /// </summary>
    /// <param name="entity"></param>
    void Add(TModel entity);

    /// <summary>
    /// Remove Item From Database .
    /// </summary>
    /// <param name="entity"></param>
    void Remove(TModel entity);

    /// <summary>
    /// Remove All Provided Items At Once .
    /// </summary>
    /// <param name="itemsToRemove"></param>
    void RemoveRange(IEnumerable<TModel> itemsToRemove);

    /// <summary>
    /// Get The Underlying Type's DbSet .
    /// </summary>
    /// <returns></returns>
    DbSet<TModel> DbSet();

    /// <summary>
    /// Find Item By Id .
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <returns></returns>
    TModel FindById<T>(T key);

}

最佳答案

您需要的是一种通用方法来查看实体的记录是否存在。您可以使用DBSet 类的Any() 方法,并将条件传递给它来搜索记录。

public bool CheckIfEntityExistsByEntityId<T>(Expression<Func<T,bool>> expr)
{
    return _baseRepository.DbSet().Any(u => expr);
}

关于c# - 使用 EF 中的通用方法检查数据库中是否存在记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47050627/

相关文章:

c# - C#中关于ThreadPool的困惑

c# - 如何将 X 按钮绑定(bind)到窗口的关闭按钮

c# - 如何在ASP.NET Core生产服务器上禁用 "Attempting to reconnect to the server"消息

导致 VSTS 中出现问题的 ASP.NET 架构表

asp.net - SignalR 和负载平衡与主动/主动粘性 session

c# - 我无法在MVC中使用Tempdata的属性

asp.net-mvc - 为什么我的 View 模型名称必须是 'model' ?

c# - 剪贴板始终为空

asp.net - web.config、configSource 和 "The ' xxx' 元素未声明“警告

asp.net-mvc - 使用 Controller 的单页应用程序 - 如何使用 ASP.NET Identity 保证安全?