我决定第一次使用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的关于您具有外键约束的错误,这意味着您无法删除该记录,因为其他记录依赖于该记录。