Универсальный репозиторий Entity Framework - PullRequest
2 голосов
/ 07 августа 2011

Я пишу общий репозиторий, который будет использоваться для каждой операции CRUD для каждой модели с использованием каркаса сущностей CTP5 следующим образом:

  public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
    {
        public DbContext Context { get; set; }


        public void Insert(TEntity entity)
        {
                if (Context.Entry<TEntity>(entity).State == EntityState.Detached)
                {
                    Context.Set<TEntity>().Attach(entity);
                }
                Context.Set<TEntity>().Add(entity);
                Context.SaveChanges();

        }
        public void Delete(int id)
        {
                TEntity entity = Context.Set<TEntity>().Find(id);
                if (Context.Entry<TEntity>(entity).State == EntityState.Detached)
                {
                    Context.Set<TEntity>().Attach(entity);
                }
                Context.Set<TEntity>().Remove(entity);
                Context.SaveChanges();

        }
        public void Delete(TEntity entity)
        {
                Context.Set<TEntity>().Remove(entity);
                Context.SaveChanges();

        }
        public void Update(TEntity entity)
        {
                TEntity status = Context.Set<TEntity>().Find(entity.Id);
                status = entity;
                Context.SaveChanges();

        }



        public TEntity GetFirst()
        {

                var entity = Context.Set<TEntity>().FirstOrDefault();
                if (entity == null) return null;
                return entity;


        }
        public TEntity GetNext(int id)
        {

                var entity = (from u in Context.Set<TEntity>()
                              where u.Id > id
                              select u).FirstOrDefault();
                if (entity == null) return null;
                return entity;

        }
        public TEntity GetPrevoius(int id)
        {

                var entity = (from u in Context.Set<TEntity>()
                                where u.Id < id
                                orderby u.Id descending
                                select u).FirstOrDefault();
                if (entity == null) return GetFirst();
                return entity;
        }
        public TEntity GetLast()
        {

                var entity = (Context.Set<TEntity>().OrderByDescending(u => u.Id)).FirstOrDefault();
                if (entity == null) return null;
                return entity;

        }
        public TEntity GetById(int id)
        {
            return Context.Set<TEntity>().Find(id);

        }
        public int GetMaxId()
        {

                var max = Context.Set<TEntity>().Count()+ 1;
                return max;

        }
}

все работает нормально, но метод Update не генерирует никаких ошибок и не сохраняет никаких изменений.вернуться в базу данных.Кто-нибудь может подсказать мне, как решить эту проблему?

Ответы [ 2 ]

8 голосов
/ 07 августа 2011

Вы можете использовать CurrentValues.SetValues:

public void Update(TEntity entity)
{
    TEntity status = Context.Set<TEntity>().Find(entity.Id);
    Context.Entry(status).CurrentValues.SetValues(entity);
    Context.SaveChanges();
}

Обновляет скалярные и сложные свойства, но не свойства навигации.

2 голосов
/ 07 августа 2011

Вы перезаписываете переменную status совершенно новым объектом, вынимаете объект из базы данных из области видимости, но фактически не модифицируете объект, который присоединен к контексту, а это то, что ты захочешь сделать.

Единственный способ, которым я могу думать над головой, - это использовать отражение, чтобы прочитать все свойства типа и присвоить значения исходному объекту на основе нового, что-то вроде:

foreach (var prop in typeof(TEntity).GetProperties())
{
    prop.SetValue(status, prop.GetValue(entity, null), null);
}
...