我决定第一次使用Entity Framework 6.0。是的,我是新来的。
与往常一样,我首先创建了数据库,然后生成了代码优先模型(通过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


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

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

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分之一)。
通过调试,我发现在大多数情况下,代码

ctx.UpdateSets.Remove(dbUpdateSet)


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


  DELETE语句与REFERENCE约束“ FK_UpdateSetStatus_UpdateSet”冲突。数据库“ UpdateWizard”的表“ dbo.StatusInfo”的列“ UpdateSetId”中发生了冲突。
  该语句已终止。


正如我之前提到的,它有时会起作用。那时,remove命令没有清除StatusInfo对象的集合。

有人可以帮忙吗?

最佳答案

您收到此错误的原因


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


在我看来这不是EF错误,它是来自sql server的关于您具有外键约束的错误,这意味着您无法删除该记录,因为其他记录依赖于该记录。

09-07 01:54