【问题标题】:Entity Framework Generic Repository实体框架通用存储库
【发布时间】:2011-08-07 18:01:45
【问题描述】:

我正在使用实体框架 CTP5 编写一个通用存储库,用于我的每个模型 CRUD 操作,如下所示:

  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;

        }
}

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

【问题讨论】:

    标签: entity-framework generics repository entity


    【解决方案1】:

    你可以使用CurrentValues.SetValues:

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

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

    【讨论】:

      【解决方案2】:

      您正在用一个全新的对象覆盖 变量 status,从数据库中取出一个超出范围的对象,但实际上并未修改附加到上下文的对象,即你想做什么。

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多