powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework 6. Получить сущность по ключу
4 сообщений из 4, страница 1 из 1
Entity Framework 6. Получить сущность по ключу
    #38594809
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!
Вопрос скорее по C#, чем непосредственно по Entity Framework.
Класс DbContextRepository - базовый DAL для различных сущностей с первичными ключами разных типов (Long, Int, Guid).
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public abstract class DbContextRepository<TKey, TValue> : IRepository<TKey, TValue>
        where TKey : struct
        where TValue : class, IObjectWithId<TKey>, new()
    {
        protected KernelContext Context;
        ...


        /// <summary>
        ///     Получить сущность из хранилища по идентификатору с включениями
        /// </summary>
        /// <param name="id">идентификатор</param>
        /// <returns>сущность или null, если сущность не найдена</returns>
        public virtual TValue GetByIdWithIncludings(TKey id, IEnumerable<Expression<Func<TValue, object>>> includings)
        {
            var query = Context.Set<TValue>() as IQueryable<TValue>;

            if (includings != null)
            {
                query = includings.Aggregate(query, (current, expression) => current.Include(expression));
            }

            return query.FirstOrDefault(b => b.Id.Equals(id)); //ХХХ
        }
        ...


При вызове метода GetByIdWithIncludings на строке ХХХ вылетает ошибка:
Код: c#
1.
Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context.


Заменить на:
Код: c#
1.
query.FirstOrDefault(b => b.Id == id);


Не получается, ибо компилятору ничего не известно про TKey кроме того, что он является структурой.
Какое условие нужно дописать в where для TKey, или как под другому разрешить проблему?
...
Рейтинг: 0 / 0
Entity Framework 6. Получить сущность по ключу
    #38595344
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Entity Framework 6. Получить сущность по ключу
    #38595527
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как прикрутить к нему навигационные свойства при условии, что для них не указано ключевое свойство virtual ?
...
Рейтинг: 0 / 0
Entity Framework 6. Получить сущность по ключу
    #38595617
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остановился пока на замене:
Код: c#
1.
2.
List<TKey> ids = new List<TKey>(){id};
return query.FirstOrDefault(b => ids.Contains(b.Id));


Кривова-то, но работает!
Сгенерированный EF sql-запрос теперь содержит строчку
Код: sql
1.
[ID] IN (...)


Что в принципе не сильно хуже ID =...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework 6. Получить сущность по ключу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]