【问题标题】:deleting record from oracle database using entity framework使用实体框架从oracle数据库中删除记录
【发布时间】: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


【解决方案1】:

您可以尝试将实体状态更改为已删除:

var task = new TWFITSK { ID = taskId.ToString() };
_context.Entry(task).State = EntityState.Deleted;
_context.SaveChanges();

更新:尝试将实体传递给您的方法,因为它听起来好像它已经附加到上下文中。这可能有效:

public void DeleteTask(TWFITSKs task)
{
    if (task == null) return;

    _context.TWFITSKs.Remove(task);
    _context.SaveChanges();
}

【讨论】:

  • @Shaggy 它必须已经附加到上下文中。如果您可以将实体传递给方法,我的更新可能会起作用
【解决方案2】:

你为什么不直接打电话给.Remove

var task = new TWFITSK { ID = taskId.ToString() };
_context.TWFITSKs.Entry(task).State = EntityState.Deleted;
_context.SaveChanges();

但如果您的数据类型不匹配,这可能仍然无法正常工作。如果可以共享表DDL脚本类定义OnModelCreating

可能会更好

【讨论】:

  • 错误:System.InvalidOperationException: 'The object cannot be deleted because it was not found in the ObjectStateManager.'
  • 因为您在不使用上下文的情况下实例化新的 TWFITSK,所以 ObjectStateManager 无法跟踪它。试试上面的方法
  • 那么请分享您的表的 DDL 脚本、类定义和 OnModelCreating 部分上下文。
猜你喜欢
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多