通用实体保存方法不起作用

本文关键字:方法 不起作用 保存 实体 | 更新日期: 2023-09-27 18:32:19

为了减少我使用的代码和类的数量,我得到了这个方法:

public TEntity Save(TEntity entity)
            {
                var validatationErrors = Entities.GetValidationErrors().ToList();
                if (validatationErrors.Count() > 0)
                    throw new ValidateException(validatationErrors);
                if (Entities.Entry(entity).State == EntityState.Added)
                    Entities.Set<TEntity>().Add(entity);
                else
                    Entities.Set<TEntity>().Attach(entity);
                Entities.SaveChanges();
                Entities.Entry(entity).Reload();
                return entity;
            }

但是,当我创建一个新产品时,它会跳过将其添加到数据库的条件。因此没有得到拯救。同样,如果我尝试修改某些内容,它也不会改变。

为了解决这个问题,我必须像这样将我的实体保存在控制器中:

using (var db = new EntitiesDbContext())
                {
                    db.Products.Attach(product);
                    db.Entry(product).State = EntityState.Modified;
                    db.SaveChanges();
                }

这似乎效率很低。所以我想知道通用保存到底有什么问题,让它不起作用?

通用实体保存方法不起作用

  • 你的代码是错误的。在您的情况下,您无需Attach您的实体。您只需要将您的实体Add到您的DbSet

            public TEntity Save(TEntity entity)
            {
                Entities.Set<TEntity>().Add(entity);        
                Entities.SaveChanges();
            }
    

您应该记住:

Entities.Set<TEntity>().Add(entity);

等于

db.Entry(entity).State = EntityState.Added;

entity.Property = newProperty;

将实体状态设置为Modifieddb.Entry(entity).State EntityState.Modified

而且您无需验证和重新加载实体。 ObjectContext为你做。

  • 要对您的实体进行条件化,请尝试以下操作:

        public TEntity Save(TEntity entity)
        {
            var dbEntity = Entities.Set<TEntity>().Find(entity.Id);
            if (dbEntity != null)               
                dbEntity = entity;
            else
                Entities.Set<TEntity>().Add(entity);
            Entities.SaveChanges();
        }
    

如果创建新实体,则应使用 .添加方法。.如果您知道数据库中存在某个对象,并且希望避免前往数据库获取它,则应使用 Attach 。

通用 Save 方法似乎也存在一些问题:

  • 除非您明确禁用验证,否则您将多次验证实体,因为默认情况下。SaveChanges() 将验证实体
  • 如果实体处于"已添加"状态,则上下文已对其进行跟踪,因此无需再次添加
  • .SaveChanges() 将尝试保存上下文跟踪的所有未处于"未更改"状态的实体。该方法给人的印象是它只会保存您传递的实体,但实际上它可能保存更多
  • 我认为调用 DbEntityEntry.Reload() 只对附加实体使用数据库中的值更新属性值有意义 - 如果您总是这样做,那么我想知道为什么您附加实体而不仅仅是从数据库中获取它。