为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
隔江千里 2022-12-31 14:06:52
我想通过提供主键数组来检索多条记录,我必须为所有实体创建它的通用方法。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 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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

}


查看完整回答
反对 回复 2022-12-31
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2022-12-31
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信