使用实体框架的C#通用存储库

使用实体框架的C#通用存储库,c#,.net,entity-framework,.net-core,entity-framework-core,C#,.net,Entity Framework,.net Core,Entity Framework Core,我想通过提供主键数组来检索多个记录,并且我必须为所有实体创建一个通用的方法 private DbSet<TEntity> _entities; /// <summary> /// Get entity by identifier /// </summary> /// <param name="id">Identifier</param>

我想通过提供主键数组来检索多个记录,并且我必须为所有实体创建一个通用的方法

private DbSet<TEntity> _entities;
      /// <summary>
            /// Get entity by identifier
            /// </summary>
            /// <param name="id">Identifier</param>
            /// <returns>Entity</returns>
            public virtual TEntity GetById(object id)
            {
                return Entities.Find(id);
            }




 /// <summary>
        /// Get entity by identifier
        /// </summary>
        /// <param name="id">Identifier</param>
        /// <returns>Entity</returns>
        public virtual List<TEntity> GetByIds(int id[])
        {
               // want to make it generic
            return Entities.Where(x=>id.Contains(id));
        }

    /// <summary>
        /// Gets an entity set
        /// </summary>
        protected virtual DbSet<TEntity> Entities
        {
            get
            {
                if (_entities == null)
                    _entities = _context.Set<TEntity>();

                return _entities;
            }
        }

我希望我的实体列与现在相同。我可以用这种数据库结构实现一种通用搜索方法来查找多个记录吗?

在应用程序模型和数据库模型中可以有不同的名称。您必须将模型ID映射到数据库中的名称:

在映射中,每个实体都有类似的内容:
this.Property(t=>t.Id).HasColumnName(“ProductId”)

您可以使用EF Core提供的元数据服务(如和)来获取PK属性名称。然后,您可以使用它访问LINQtoEntities查询中的PK值,使用另一个EF核心提供的有用方法

大概是这样的:

public virtual List<TEntity> GetByIds(int[] ids)
{
    var idName = _context.Model.FindEntityType(typeof(TEntity))
        .FindPrimaryKey().Properties.Single().Name;
    return Entities
        .Where(x => ids.Contains(EF.Property<int>(x, idName)))
        .ToList();
}
public虚拟列表GetByIds(int[]ids)
{
var idName=_context.Model.FindEntityType(typeof(tenty))
.FindPrimaryKey().Properties.Single().Name;
返回实体
.Where(x=>ids.Contains(EF.Property(x,idName)))
.ToList();
}

可能与之重复,或者,接受以下事实:
DbSet
已经是一个通用存储库,而不是另一个通用存储库。DbConext是工作单元,DbSet是存储库。@Fabio不,它不是
Find
接受由一个或多个值组成的单个PK(在复合PK的情况下)。hi@IvanStoev注意警告:此API支持实体框架核心基础结构,不打算直接从代码中使用。此API可能会在将来的版本中更改或删除。嗨@IvanStoev这样做对性能有什么影响?没有.FindPrimaryKey().Properties。在尝试查找主键时导致数据库表上的架构锁定?它是否会导致应用程序运行缓慢?如果我们创建分部类来自动生成ID呢?每种方法在性能方面的优点/缺点是什么?感谢您在此处发布问题,注意警告:此API支持Entity Framework核心基础架构,不打算直接从您的代码中使用。此API可能会在将来的版本中更改或删除@jerrythomas38您正在查看错误的方法文档(内部类实现)。正确的链接是。答案中使用的所有方法都是public.greatl!谢谢,我也想听听你对性能问题的看法
public virtual List<TEntity> GetByIds(int[] ids)
{
    var idName = _context.Model.FindEntityType(typeof(TEntity))
        .FindPrimaryKey().Properties.Single().Name;
    return Entities
        .Where(x => ids.Contains(EF.Property<int>(x, idName)))
        .ToList();
}