【发布时间】:2019-02-26 07:31:55
【问题描述】:
我想使用实体框架删除一条记录。 DB 是 oracle。
方法一:
public void DeleteTask(Guid taskId, string userId)
{
var task = _context.TWFITSKs.FirstOrDefault(x => x.ID == taskId.ToString());//<---Error line
if (task == null) return;
_context.TWFITSKs.Attach(task);
_context.TWFITSKs.Remove(task);
_context.SaveChanges();
}
错误:ORA-00932:不一致的数据类型:预期 - 得到 CLOB
TWFITSK 确实包含数据类型为 CLOB 的列,但不确定为什么会导致此 select 语句出现问题。
方法二:
public void DeleteTask(Guid taskId, string userId)
{
var task = new TWFITSK { ID = taskId.ToString() };
_context.TWFITSKs.Attach(task); // <--- Error line
_context.TWFITSKs.Remove(task);
_context.SaveChanges();
}
错误:System.InvalidOperationException:'附加类型的实体 'XXXXX.TWFITSK' 失败,因为已经有另一个相同类型的实体 具有相同的主键值。使用时可能会发生这种情况 “附加”方法或将实体的状态设置为“未更改”或 如果图中的任何实体具有冲突的键值,则“已修改”。 这可能是因为有些实体是新的,尚未收到 数据库生成的键值。在这种情况下,使用“添加”方法或 'Added' 实体状态来跟踪图形,然后设置状态 将非新实体改为“未更改”或“已修改”。
方法3:
public void DeleteTask(Guid taskId, string userId)
{
var task = new TWFITSK { ID = taskId.ToString() };
_context.TWFITSKs.Remove(task); //<--- Error line
_context.SaveChanges();
}
错误:无法删除该对象,因为它在 对象状态管理器
【问题讨论】:
-
在您的方法 1 中,您应该摆脱 Attach 调用,因为您是从上下文中获取它的,因此无需附加
标签: c# oracle entity-framework