繁体   English   中英

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

[英]Generic Repository in C# Using Entity Framework

我想通过给出主键数组来检索多个记录,我必须为所有实体制作它的泛型方法。

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列,例如Product有ProductId,Order有OrderId。 我不想将我的数据库列更改为Id。

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

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

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

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

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

像这样的东西:

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM