powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Требуется консультация эксперта (EF CF)
2 сообщений из 2, страница 1 из 1
Требуется консультация эксперта (EF CF)
    #38378024
Ferromagnetic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Перелопатил кучу информации и везде, либо примитивные примеры, либо встречал несколько на буржуйских сайтах описание моей ситуации, но у них почему-то никаких проблем. Надеюсь кто-нибудь сможет подсказать в какую сторону копать.

Итак хочу сделать:
универсальный IRepository <T> + EF CodeFirst, и вроде все просто кажется ) но сущностей может быть много, и все книжки учат создавать для каждой сущности в контексте DBSet на каждый вид. Но при таком раскладе теряется универсальность. В таком случае в репозитории мне еще надо проверять какая сущность была передана и вызывать именно этот DbSet.

Предполагаемое решение:

BaseEntity - интерфейс, который наследуют все сущности (через абстрактный класс тоже пробывал)

Интерфейс контекста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
public interface IDbContext
    {

        IDbSet<TEntity> Set<TEntity>() where TEntity : class, BaseEntity;

        int SaveChanges();

    }



Класс контекста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public class EfContext : DbContext, IDbContext
    {
//Это в принципе не особо важно, имя совпадает с наименованием класса
        public EfContext() : base("name=EfContext")  {}

//Это в принципе тоже убрать
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            
        }

//Вот этот метод по идее как раз таки динамически и должен связывать контекст и ДбСет
        public IDbSet<TEntity> Set<TEntity>() where TEntity : class, BaseEntity
        {
            return base.Set<TEntity>();
        }

       
    } 



Дальше репозиторий:
Интерфейс обычный CRUD
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface IRepository<T> where T:BaseEntity 
    {
        T GetById(object id);
        void Insert(T entity);
        void Update(T entity);
        void Delete(T entity);
        IQueryable<T> Table { get; }
         
    } 



Код: sql
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.
26.
27.
  public class EfRepository<T>: IRepository<T> where T:class, BaseEntity
    {
        protected readonly IDbContext _context;
        protected readonly IDbSet<T> Entities;

        public EfRepository(IDbContext context) {
            this._context = context;            
            Entities = context.Set<T>();  // c этого момента по идее Entities ссылается на DbSet заданной сущности <T>         
        }

        public T GetById(object id)
        {
            return Entities.Find(id);
        }

        public void Insert(T entity)
        {
           
               Entities.Add(entity); // вот тут ошибка
                _context.SaveChanges();
         
        }

// ... реализация остальных методов
       
            
        }



Результат: вылетает исключение
Код: sql
1.
The entity type [сущность] is not part of the model for the current context. 


Пробовал вариант с фиксированным DbSetами, тогда все работало, он и табличку сам создавал и записывал в нее данные.
Но если после того как он создал табличку убрать DbSet и вернуть к варианту выше, то ругается уже на то, что модель изменилась.
В отладчике смотрел, Entities действительно имеет тип DbSet<ПереданнаяСущность> и сохраняемый объект имеет такой же тип. Мне кажется тут что-то именно с маппингом на БД связано, может кто-то сталкивался, потому что плодить кучу сетов в одном контексте, а потом еще и репозитории как это по сути предлагают во многих статьях - считаю неправильным.

Всем заранее большое спасибо, кто откликнется.
...
Рейтинг: 0 / 0
Требуется консультация эксперта (EF CF)
    #38379498
Ferromagnetic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем "всем" спасибо, вроде нашел компромисс, путем создания в контексте ДбСетов для каждой сущности отдельно, но в остальном коде участвует только универсальный DbSet, который не выдает ошибок за счет того, что существует фиксированный экземпляр ДбСета для данной сущности. Если кто-то знает как обойтись без этого или как сделать правильнее, то пишите - не стесняйтесь :)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Требуется консультация эксперта (EF CF)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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