【问题标题】:Generic Repository in C# Using Entity FrameworkC# 中使用实体框架的通用存储库
【发布时间】:2019-04-27 20:52:20
【问题描述】:

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

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。我不想将我的 db 列更改为 Id。

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

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

【问题讨论】:

  • 或者,接受DbSet 已经一个通用存储库的事实?
  • 不是另一个通用存储库。 DbConext 是工作单元,DbSet 是存储库。
  • @Fabio 不,它没有。 Find 接受由一个或多个值组成的 单个 PK(在复合 PK 的情况下)。
  • hi @IvanStoev 注意警告:此 API 支持 Entity Framework Core 基础架构,不打算直接从您的代码中使用。此 API 可能会在未来的版本中更改或删除。 docs.microsoft.com/en-us/dotnet/api/…

标签: c# .net entity-framework .net-core entity-framework-core


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多