"Invalid Object Name" 在 db.SaveChanges() 期间出错(实体 Framework/MVC)
"Invalid Object Name" error during db.SaveChanges() (Entity Framework/MVC)
(已解决)
当我试图从我们正在构建的应用程序中保存对实体的更改时,我遇到了一个非常奇怪的错误。
[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 或类似内容的信息。我确实记得一个多星期前在数据库中看到一个具有相似名称的table,它已经被删除了。
我已经从数据库更新了我的模型,重建了项目,搜索了项目以查找对此 table 的任何引用,验证了数据库中不存在 table。我在调试期间检查了 db 对象,但找不到对此对象的任何引用,并且我已验证连接字符串是正确的并且包含数据库名称(不仅仅是服务器名称)。我现在不知道如何解决这个问题。请帮忙!
谢谢!
编辑:在 SQL 服务器的报告 table 上确实设置了一个触发器,这导致服务器拒绝我使用上述消息的更新。触发器似乎来自在此 table 上使用 FuzzyLookup 的 SSIS 包。删除触发器应该可以解决此问题。
您是否尝试过转到您的模型,然后按 Ctrl+A 到 select 所有 tables/views/etc,然后按删除。
然后再次从数据库更新。
我在 EF 中出现了几个随机错误,因为 'update from database' 不会删除早已被删除的旧对象!!
显然可能值得先进行备份,尽管我在使用此技术时从未遇到过问题。
感谢用户 br4d!
SQL 服务器中的报告 table 上有一个触发器,由在此 table 上使用 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 table。删了就没问题了
毕竟我的应用程序代码没有问题。
(已解决)
当我试图从我们正在构建的应用程序中保存对实体的更改时,我遇到了一个非常奇怪的错误。
[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 或类似内容的信息。我确实记得一个多星期前在数据库中看到一个具有相似名称的table,它已经被删除了。
我已经从数据库更新了我的模型,重建了项目,搜索了项目以查找对此 table 的任何引用,验证了数据库中不存在 table。我在调试期间检查了 db 对象,但找不到对此对象的任何引用,并且我已验证连接字符串是正确的并且包含数据库名称(不仅仅是服务器名称)。我现在不知道如何解决这个问题。请帮忙!
谢谢!
编辑:在 SQL 服务器的报告 table 上确实设置了一个触发器,这导致服务器拒绝我使用上述消息的更新。触发器似乎来自在此 table 上使用 FuzzyLookup 的 SSIS 包。删除触发器应该可以解决此问题。
您是否尝试过转到您的模型,然后按 Ctrl+A 到 select 所有 tables/views/etc,然后按删除。
然后再次从数据库更新。
我在 EF 中出现了几个随机错误,因为 'update from database' 不会删除早已被删除的旧对象!!
显然可能值得先进行备份,尽管我在使用此技术时从未遇到过问题。
感谢用户 br4d!
SQL 服务器中的报告 table 上有一个触发器,由在此 table 上使用 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 table。删了就没问题了
毕竟我的应用程序代码没有问题。