【发布时间】:2015-06-06 18:56:44
【问题描述】:
我正在努力在 DbContext 上实现一个非常基本的“InsertOrUpdate()”方法。我尝试按照this post 中的建议进行操作。
private static bool SaveItem<TEntity>(Object objToSave, TEntity existing = null) where TEntity : class
{
try
{
/////////////////////////////////////////
// BLOCK A
if(existing != null)
db.Set<TEntity>().Attach(existing);
/////////////////////////////////////////
db.Entry(objToSave).State = existing!=null ? EntityState.Modified : EntityState.Added;
db.SaveChanges();
} catch(Exception e)
{
Logger.Exception(e);
return false;
}
return true;
}
一个示例调用如下:
SaveItem(item, db.MyInstances.Where(dbItem => dbItem.ID == item.ID).FirstOrDefault());
一些定义:
class MyInstancesDbContext: DbContext { ... }
private static MyInstancesDbContext db = new MyInstancesDbContext();
据我了解,在该调用中,.Where() 将导致某种附件。因此,我尝试了包括标记为“A”的一小段代码并将其删除。两者都给了我同样的错误:
System.InvalidOperationException:附加类型为“...MyInstance”的实体失败,因为 相同类型的其他实体已经具有相同的主键值。当使用“附加”方法或将实体的状态设置为“未更改”或“已修改”(如果有)时,可能会发生这种情况 图中的 tities 具有冲突的键值。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“ 添加了实体状态来跟踪图表,然后将非新实体的状态设置为“未更改”或“已修改”。
我在用户建议使用AsNoTracking() 的错误中找到了this popular related answer,但这反而让我觉得我没有从根本上理解某些东西或试图忽略一些错误。
如果有任何建议,我将不胜感激。
【问题讨论】:
-
为什么
objToSave类型为Object而existing是TEntity?他们不应该是一样的吗?
标签: c# entity-framework