我正在开发Entity Framework 4.0。这里使用AddObject()将控制添加到数据库中并保存起来使用SaveChange()方法。
但是一旦我删除了添加的控件并尝试再次添加,我会一次又一次地收到此错误
存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新
ObjectStateManager
条目。
我无法添加它。一旦我关闭我的应用程序然后尝试添加然后我能够添加该控件。
我试图在这里搜索很多,但是找不到解决办法。 因为我是实体框架领域的新生。
public void Add(SearchPath entity) {
_context.SearchPaths.AddObject(entity);
// _context.Save(entity, false);
}
public void Remove(SearchPath entity)
{
if (entity.Path != null)
{
using (EntityContext entityObj = new EntityContext())
{
entityObj.SearchPaths.Attach(entity);
entityObj.SearchPaths.DeleteObject(entity);
entityObj.SaveChanges();
}
}
}
public void Modify(SearchPath entity)
{
using (EntityContext entityObj = new EntityContext())
{
try
{
entityObj.SearchPaths.Attach(entity);
entityObj.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
entityObj.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entityObj.Refresh(RefreshMode.StoreWins, entity);
entityObj.SaveChanges();
}
}
}
public void Add(Package entity)
{
_context.Packages.AddObject(entity);
}
public void Remove(Package entity)
{
if (_context.GetEntityState(entity) == EntityState.Unchanged)
_context.Packages.Attach(entity);
_context.Packages.DeleteObject(entity);
}
答案 0 :(得分:1)
上述问题的答案就是这样调用你自己的保存方法。
public void Save(object entity)
{
using (var transaction = Connection.BeginTransaction())
{
try
{
SaveChanges();
transaction.Commit();
}
catch (OptimisticConcurrencyException)
{
if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
this.Refresh(RefreshMode.StoreWins, entity);
else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
Detach(entity);
AcceptAllChanges();
transaction.Commit();
}
}
}
答案 1 :(得分:0)
一旦我删除了添加的控件并尝试再次添加
问题是你显然是在同一个环境中做到这一点。对我来说,这表明上下文的生命周期太长了。在EF中使用上下文实例的最佳方法是每个工作单元(或业务事务或用例)的一个上下文。
因此,如果要删除控件:创建上下文,删除控件,配置上下文。如果要再次添加(由于某种原因):创建上下文,添加控件,处置上下文。从你的代码片段中我不完全清楚你的代码是否会发生这种情况。