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

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


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

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


隔江千里
浏览 111回答 2
2回答

牧羊人nacy

您可以使用 EF Core 提供的元数据服务(如FindEntityType和FindPrimaryKey)来获取 PK 属性名称。然后,您可以使用它访问 LINQ to Entities 查询中的 PK 值,使用另一个 EF Core 提供的有用方法EF.Property。是这样的:public virtual List<TEntity> GetByIds(int[] ids){&nbsp; &nbsp; var idName = _context.Model.FindEntityType(typeof(TEntity))&nbsp; &nbsp; &nbsp; &nbsp; .FindPrimaryKey().Properties.Single().Name;&nbsp; &nbsp; return Entities&nbsp; &nbsp; &nbsp; &nbsp; .Where(x => ids.Contains(EF.Property<int>(x, idName)))&nbsp; &nbsp; &nbsp; &nbsp; .ToList();}

一只萌萌小番薯

您可以在应用程序模型和数据库模型中使用不同的名称。您必须将模型 ID 映射到数据库中的名称:在您的映射中,每个实体都会有类似的内容:this.Property(t => t.Id).HasColumnName("ProductId");
打开App,查看更多内容
随时随地看视频慕课网APP