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

时间:2019-04-26 12:31:24

标签: c# .net entity-framework .net-core entity-framework-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;
            }
        }

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

Entities.Where(x=>id.Contains(id));

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您可以使用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();
}