实体框架6.0 - 删除时的奇怪行为

时间:2014-11-06 20:35:30

标签: c# vb.net entity-framework-6

我决定第一次使用Entity Framework 6.0。所以是的,我是新手。 和往常一样,我先创建了数据库,然后生成Code First模型(通过Visual Studio向导),如下所示:

Partial Public Class DataContext
Inherits DbContext

Public Sub New()
    MyBase.New("name=DataContext")
End Sub

Shared Sub New()
    DbInterception.Add(New FullTextInterceptor())
End Sub

Public Overridable Property StatusInfoes As DbSet(Of StatusInfo)
Public Overridable Property UpdateSets As DbSet(Of UpdateSet)
Public Overridable Property Users As DbSet(Of User)

Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
    modelBuilder.Configurations.Add(New UpdateSetFtsMap)

    modelBuilder.Entity(Of StatusInfo)() _
        .Property(Function(e) e.Information) _
        .IsUnicode(False)

    modelBuilder.Entity(Of UpdateSet)() _
        .Property(Function(e) e.Title) _
        .IsUnicode(False)

    modelBuilder.Entity(Of UpdateSet)() _
        .Property(Function(e) e.Files) _
        .IsUnicode(False)

    modelBuilder.Entity(Of UpdateSet)() _
        .HasMany(Function(e) e.StatusInfoes) _
        .WithRequired(Function(e) e.UpdateSet) _
        .WillCascadeOnDelete(False)

    modelBuilder.Entity(Of User)() _
        .Property(Function(e) e.Login) _
        .IsUnicode(False)

    modelBuilder.Entity(Of User)() _
        .Property(Function(e) e.Password) _
        .IsUnicode(False)

    modelBuilder.Entity(Of User)() _
        .Property(Function(e) e.Surname) _
        .IsUnicode(False)

    modelBuilder.Entity(Of User)() _
        .Property(Function(e) e.Name) _
        .IsUnicode(False)

    modelBuilder.Entity(Of User)() _
        .HasMany(Function(e) e.StatusInfoes) _
        .WithRequired(Function(e) e.User) _
        .WillCascadeOnDelete(False)
End Sub

Public Function GetServerDate() As DateTime
    Return Database.SqlQuery(Of DateTime)("Select GetDate()").SingleOrDefault
End Function

End Class

所以我有一个 UpdateSet 对象,至少有一个 StatusInfo 对象。 到目前为止一切都很好。

奇怪的是删除。这是我的代码:

Public Function DeleteById(id As Integer) As Integer Implements IDataMapper(Of UpdateSetDataTransferObject).DeleteById
    Dim result = -1

    Using ctx As New DataContext
        Dim dbUpdateSet = (From o In ctx.UpdateSets Where o.Id = id Select o).SingleOrDefault

        If dbUpdateSet IsNot Nothing Then
            ctx.UpdateSets.Remove(dbUpdateSet)

            Try
                ctx.SaveChanges()
                result = 0
            Catch ex As DbUpdateException
            End Try
        End If
    End Using

    Return result
End Function

奇怪的是,它有时会起作用。 (20个中有1个让我们说)。 通过调试,我观察到在大多数情况下代码

ctx.UpdateSets.Remove(dbUpdateSet)

从StatusInfoes集合中删除所有StatusInfo对象(子对象),因此我认为EF没有关于要删除的子项的信息。所以我得到错误:

  

DELETE语句与REFERENCE约束冲突" FK_UpdateSetStatus_UpdateSet"。冲突发生在数据库" UpdateWizard",table" dbo.StatusInfo",column' UpdateSetId'中。   声明已经终止。

正如我之前提到的,有时候它有效。那些时候,删除命令没有清除StatusInfo对象的集合。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您收到此错误的原因

  

DELETE语句与REFERENCE约束“FK_UpdateSetStatus_UpdateSet”冲突。冲突发生在数据库“UpdateWizard”,表“dbo.StatusInfo”,列“UpdateSetId”。

在我看来不是EF错误它来自sql server的错误,因为你有一个外键约束,这意味着你可以删除记录,因为其他记录依赖于它。

答案 1 :(得分:1)

我找到了解决方案,现在看起来很明显。我只需要在父(UpdateSet对象)和子(StatusInfo对象)之间的外键约束上启用级联删除。阅读有关在EF4.0中修改实体的文章我在一段中写了“在数据库和EF配置中打开或关闭级联删除”。在我的情况下,因为数据库是先创建的,所以这是关闭的,所以当我创建模型(代码优先)时,它也在EF中关闭。所以我猜在这种情况下我不得不手动删除所有孩子。说实话,因为我老了,我对此并不感到兴奋(限制级联删除),但我无法想象EF的其他方式。再次感谢大家。希望这有助于其他人。