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

Imr*_*hid 4 .net c# entity-framework entity-framework-core .net-core

我想通过提供主键数组来检索多条记录,并且我必须为所有实体制定通用方法。

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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

这里的问题是我的实体没有 ID 列,例如产品有 ProductId,订单有 OrderId。我不想将我的数据库列更改为 Id。

Entities.Where(x=>id.Contains(id));
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*oev 5

您可以使用 EF Core 提供的元数据服务(例如FindEntityTypeFindPrimaryKey)来获取 PK 属性名称。然后,您可以使用它来使用另一个 EF Core 提供的有用方法EF.Property来访问 LINQ to Entities 查询中的 PK 值。

像这样的东西:

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();
}
Run Code Online (Sandbox Code Playgroud)