在db.SaveChanges()过程中出现 "无效的对象名称 "错误(Entity Framework/MVC)。

4 人关注

(已解决)

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

    [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的报告表上确实有一个触发器,它导致服务器用上述信息拒绝我的更新。这个触发器似乎来自一个SSIS包,它在这个表上使用了FuzzyLookup。删除该触发器应该可以解决这个问题。

4 个评论
你有没有检查过数据库中的任何触发器?你是否在你的代码中做了任何类型的日志记录......也许是一个自定义的ObjectContext.SaveChanges方法或其他什么?
Eric
没有自定义日志,没有触发器。我也有过关于触发器的想法。
尝试使用SQL management studio本身插入一个假的项目,看看它是否给出了一个更好的错误信息。如果插入成功,那么你可能想检查你的EDMX模型浏览器是否有类似的名字。
Eric
我错了!在报告表中有一个寻找该表的触发器。我不知道我之前怎么会错过它。你能贴出答案吗,这样我就能把它标记为正确的了?
c#
asp.net-mvc
entity-framework
sql-server-2008
ef-database-first
Eric
Eric
发布于 2015-07-16
2 个回答
Eric
Eric
发布于 2015-07-16
已采纳
0 人赞同

解决了,感谢用户br4d!

在SQL Server的Report表上有一个触发器,是在这个表上使用FuzzyLookup的SSIS包留下的。我不确定我怎么会错过它,因为我肯定在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上的一个触发器,仔细检查了Triggers文件夹,看,它就在那里。它在INSERT、UPDATE和DELETE查询中寻找tg_DataCleaning_xxx表。删除了它,不再有任何问题了。

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

3-14159265358979323846264
3-14159265358979323846264
发布于 2015-07-16
0 人赞同

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