簡體   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