实体框架通用存储库

时间:2011-08-07 18:01:45

标签: entity-framework generics repository entity

我正在编写一个通用存储库,用于我的每个模型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;

        }
}

一切正常但更新方法既不会产生任何错误也不会将任何更改保存回数据库。 有人能指导我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:8)

您可以使用CurrentValues.SetValues

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

它更新标量和复杂属性,但不更新导航属性。

答案 1 :(得分:2)

你用一个全新的对象覆盖变量 status,从数据库中取出一个超出范围,但实际上没有修改附加到上下文的对象,这就是你想要做的事。

我能想到的唯一方法是使用反射来读取该类型的所有属性,并根据新的对象将值分配给原始对象,如:

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