上帝的一天!
我有一棵实体树,在特定时间点我只需要更新一个实体的标量属性。经典更新上升整个图查找,但关系不需要更新。
类别实体中的麻烦是一个类别在子类别中有另一个类别。保存有关重复键的更改时,我的方法会生成异常。我认为 EF 尝试将孩子添加到数据库中。
下面列出了我的数据上下文的静态方法:
public static void Update<T>(T item) where T : KeyedObject
{
if (item == null)
throw new ArgumentNullException("Item to update is null");
item.ValidateIsNotNew();
using (DataContext db = new DataContext())
{
T original = GetOriginalWithException<T>(db, item);
DbEntityEntry entry = db.Entry(original);
entry.CurrentValues.SetValues(item);
entry.State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (Exception ex)
{
throw new DatabaseException(
"Cant update list item. See inner exception for details.",
ex);
}
}
}
我尝试了另一种方法:附加对象。此方法不会抛出异常,但会增加整个图形更新并占用大量资源。下面列出的代码:
public static void Update<T>(T item) where T : KeyedObject
{
if (item == null)
throw new ArgumentNullException("Item to update is null");
item.ValidateIsNotNew();
using (DataContext db = new DataContext())
{
db.Set<T>().Attach(item);
db.Entry(item).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (Exception ex)
{
throw new DatabaseException(
"Cant update list item. See inner exception for details.",
ex);
}
}
}