C# 在asp.net mvc中删除对象不会';行不通

C# 在asp.net mvc中删除对象不会';行不通,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,在控制器中,对象被构建并保存到数据库中。 在同一控制器操作中,我创建了另一个不同类型的对象并保存了它(SecondType类还包括一个ID): 这很有效。当查看索引(我使用脚手架选项创建了经典的创建、删除……视图)或详细视图时,我可以看到这个对象,也可以修改它。但是,如果单击delete,它将显示第一个视图,在该视图中我必须确认删除操作,按下submit按钮后,它将返回一个DbUpdateException,在SaveChanges命令中没有任何进一步的信息: [HttpPost, Action

在控制器中,对象被构建并保存到数据库中。 在同一控制器操作中,我创建了另一个不同类型的对象并保存了它(SecondType类还包括一个ID):

这很有效。当查看索引(我使用脚手架选项创建了经典的创建、删除……视图)或详细视图时,我可以看到这个对象,也可以修改它。但是,如果单击delete,它将显示第一个视图,在该视图中我必须确认删除操作,按下submit按钮后,它将返回一个
DbUpdateException
,在
SaveChanges
命令中没有任何进一步的信息:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    SecondType secondType = db.SecondTypes.Find(id);
    db.SecondTypes.Remove(secondType);
    db.SaveChanges();
    return RedirectToAction("Index");
}
我不知道为什么会发生这种情况,如果您有任何想法来解决这个问题,我将非常感激

这是我可以复制的:

System.Data.Entity.Infrastructure.DbUpdateException ist aufgetreten.
HResult=-2146233087
Message=Fehler beim Aktualisieren der Einträge (= Error while updating the entries). Weitere Informationen  finden Sie in der internen Ausnahme.
  Source=EntityFramework
  StackTrace:
   bei System.Data.Entity.Internal.InternalContext.SaveChanges()
   bei System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   bei System.Data.Entity.DbContext.SaveChanges()
   bei Irgendwas.Controllers.SecondTypeController.DeleteConfirmed(Int32 id) in c:\Users\username\Documents\Visual Studio 2012\Projects\Irgendwas\Irgendwas\Irgendwas\Controllers\SecondTypeController.cs:Zeile 113.
  InnerException: System.Data.UpdateException
   HResult=-2146233087
   Message=Fehler beim Aktualisieren der Einträge. Weitere Informationen finden Sie in der internen Ausnahme.
   Source=System.Data.Entity
   StackTrace:
        bei System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
        bei System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
        bei System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
        bei System.Data.Entity.Internal.InternalContext.SaveChanges()
        InnerException: System.Data.SqlClient.SqlException
        HResult=-2146232060
        Message=Die DELETE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung 'FK_dbo.ThirdTypes_dbo.Second_SecondType_ID'. Der Konflikt trat in der 'Irgendwas.Models.SecondTypeContext'-Datenbank, Tabelle 'dbo.ThirdTypes', column 'SecondType_ID' auf.
Die Anweisung wurde beendet.
        Source=.Net SqlClient Data Provider
        ErrorCode=-2146232060
        Class=16
        LineNumber=1
        Number=547
        Procedure=""
        Server=.\SQLEXPRESS
        State=0
        StackTrace:
             bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
             bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
             bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
             bei System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
             bei System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
             bei System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
             bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
             bei System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
             bei System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
             bei System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
             bei System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
        InnerException: 

我的德语有点粗糙,但我认为dbo.ThirdTypes表中的条目引用了您试图从dbo.SecondTypes表中删除的条目

在删除secondType条目并调用SaveChanges()之前,请尝试删除引用dbo.SecondTypes的所有dbo.ThirdTypes条目

像这样:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    SecondType secondType = db.SecondTypes.Find(id);

    foreach (var thirdType in secondType.ThirdTypes)
    {
        db.ThirdTypes.Remove(thirdType);
    }

    db.SecondTypes.Remove(secondType);
    db.SaveChanges();
    return RedirectToAction("Index");
}

您还可以对数据库中的关系启用级联删除。

DbUpdateException是否设置了InnerException属性?如果是这样的话,它会说什么?这篇文章概述了一种捕获DbUpdateException的好方法,我如何才能看到属性是否已设置以及它的内容是什么
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    SecondType secondType = db.SecondTypes.Find(id);

    foreach (var thirdType in secondType.ThirdTypes)
    {
        db.ThirdTypes.Remove(thirdType);
    }

    db.SecondTypes.Remove(secondType);
    db.SaveChanges();
    return RedirectToAction("Index");
}