无效的对象名称;在db.SaveChanges()(实体框架/MVC)期间出现错误

本文关键字:MVC 框架 错误 实体 db 无效 SaveChanges 对象 | 更新日期: 2023-09-27 18:02:58

(已解决)

当试图从我们正在构建的应用程序中保存对实体的更改时,我得到了一个非常奇怪的错误。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ReportID,RecordID,ReportName,FileName,ReportTypeID,OwningApplicationID,RecordCID,AssignedUserID")] Report report)
    {
        if (ModelState.IsValid)
        {
            db.Entry(report).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.OwningApplicationID = new SelectList(db.Applications, "ApplicationID", "ApplicationName", report.OwningApplicationID);
        ViewBag.ReportTypeID = new SelectList(db.ReportTypes, "ReportTypeID", "ReportTypeText", report.ReportTypeID);
        return View(report);
    }

在db.SaveChanges()我得到以下错误:

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code

如果检查内部异常,我发现如下:

"Invalid object name 'tg_DataCleaningMaintenance_PendingInsert__20150709_000000_953cccd7-0ba4-4b3e-ae5d-df6b936841f8'."

异常出现在这里:

at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut) at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func'2 updateFunction) at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update() at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__35() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func'1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction) at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass2a.<SaveChangesInternal>b__27()

我在网上找不到任何关于DataCleaningMaintenance_PendingInsert或类似的东西。我确实记得一个多星期前在数据库中看到过一个名字类似的表,但它已经被删除了。

我已经从数据库中更新了我的模型,重建了项目,在项目中搜索了对该表的任何引用,验证了该表在数据库中不存在。我在调试期间检查了db对象,找不到对该对象的任何引用,并且我已经验证了连接字符串是正确的,并且包含数据库名称(而不仅仅是服务器名称)。在这一点上,我不知道如何处理这个问题。请帮助!

谢谢!

编辑:在SQL Server的报表表上确实有一个触发器设置,这导致服务器拒绝我的更新与上述消息。该触发器似乎来自一个在该表上使用了FuzzyLookup的SSIS包。删除触发器应该可以解决这个问题。

无效的对象名称;在db.SaveChanges()(实体框架/MVC)期间出现错误

感谢用户br4d解决!

SQL Server中的报表表上有一个触发器,这是SSIS包在该表上使用FuzzyLookup时留下的。我不确定我是如何错过它的,因为我绝对检查了SSMS中的触发器。我用这个查询找到它:

SELECT * FROM (
  SELECT OBJECT_NAME(OBJECT_ID) Obj,
  SCHEMA_NAME(schema_id) [Schema],
  OBJECT_NAME(parent_object_id) Parent,
  type_desc Obj_Type
  FROM sys.objects
) Objects
WHERE Obj LIKE 'tg_%'

看到它是Report上的触发器,仔细检查触发器文件夹,瞧,它在那里。它在INSERT、UPDATE和DELETE查询上查找tg_DataCleaning_xxx表。删除后不再有任何问题。

毕竟我的应用程序代码没有问题。

您是否尝试过进入您的模型,然后按Ctrl+A选择所有表/视图等,然后按删除。

然后再从数据库中更新。

我在EF中出现了几个随机错误,因为"从数据库更新"不会删除早就被删除的旧对象!!

显然值得先做一个备份,尽管我使用这种技术从来没有遇到过问题。