c# - 使用 Entity Framework 的 C# 中的通用存储库

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

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

最佳答案

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

关于c# - 使用 Entity Framework 的 C# 中的通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55867725/

相关文章:

c# - .NET 版本之间的差异(主要是 c#)

c# - .NET Jquery 脚本错误

c# - 无法将类型 'Newtonsoft.Json.Linq.JToken' 隐式转换为 'string' 。存在显式转换(您是否缺少转换?)

c# - 使用另一个更轻的对象序列化具有虚拟属性的对象

c# - ASP.Net MVC :How to rewrite url by middleware in ASP. 网络核心

c# - 如何使用嵌入的discord.net webhook C# 发送文件附件

c# - 如何比较两个 X509Certificate2 c#

c# - Entity Framework 4 是否具有包含功能?

security - Entity Framework 安全和注入(inject)

c# - 如何临时暂停实时数据图表的绘制更新