检查EF中的通用方法是否存在记录

时间:2017-11-01 08:09:46

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

我正在开发一个Asp.Net MVC应用程序,我正在尝试编写一个通用方法来检查DB中是否存在实体,或者使用传递的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获取传递给my方法的实体的主键字段。此外,我不想在我使用上述方法的任何地方将实体的主键字段传递给我的方法。 是否可以在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);

}

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

您可以使用实体的抽象基类来始终知道关键属性

protected abstract class BaseEntity<TKey> where TKey: IConvertable
{
    public TKey Id {get;set;}
} 

答案 2 :(得分:1)

您可以使用

的EF6 .Find方法
  

查找具有给定主键值的实体。

同样简单:

public bool Exists(object key)
{
    return _baseRepository.DbSet().Find(key) != null;
}