通用实体保存方法不起作用
本文关键字:方法 不起作用 保存 实体 | 更新日期: 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;
将实体状态设置为Modified
(db.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() 只对附加实体使用数据库中的值更新属性值有意义 - 如果您总是这样做,那么我想知道为什么您附加实体而不仅仅是从数据库中获取它。