为了减少我使用的代码和类的数量,我得到了这个方法:
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();
}
这看起来效率很低。 所以我真的想知道通用保存有什么问题让它无效?
答案 0 :(得分:1)
您的代码错了。在您的情况下,您不需要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();
}
答案 1 :(得分:0)
如果您创建新实体,则应使用.Add方法。如果你有一个你知道它存在于数据库中的对象并且你想避免去数据库去获取它,那么应该使用.tatch。
通用Save方法似乎也存在一些问题: