Универсальный репозиторий в C # с использованием Entity Framework - PullRequest
2 голосов
/ 26 апреля 2019

Я хочу получить несколько записей, задав массив первичного ключа, и мне нужно сделать его общий метод для всех сущностей.

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

Проблема здесь в том, что у моих сущностей нет столбцов идентификаторов, например, у Product ProductId, Order - OrderId. Я не хочу менять мои столбцы БД на Id.

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

Я хочу, чтобы столбцы моих сущностей были такими же, как сейчас. я могу добиться универсального метода поиска с этой структурой БД, чтобы найти несколько записей?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Вы можете использовать службы метаданных EF Core, такие как FindEntityType и FindPrimaryKey , чтобы получить имя свойства PK. Затем вы можете использовать его для доступа к значению PK в запросе LINQ to Entities, используя другой полезный метод 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 голосов
/ 26 апреля 2019

Вы можете иметь разные имена в вашей модели приложения и модели базы данных.Вам необходимо сопоставить свои идентификаторы модели с именем в базе данных:

В вашем отображении у вас будет что-то похожее для каждой сущности: this.Property (t => t.Id) .HasColumnName ("ProductId«);

...