我决定第一次使用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对象的集合。
有人可以帮忙吗?
答案 0 :(得分:2)
您收到此错误的原因
DELETE语句与REFERENCE约束“FK_UpdateSetStatus_UpdateSet”冲突。冲突发生在数据库“UpdateWizard”,表“dbo.StatusInfo”,列“UpdateSetId”。
在我看来不是EF错误它来自sql server的错误,因为你有一个外键约束,这意味着你可以删除记录,因为其他记录依赖于它。
答案 1 :(得分:1)
我找到了解决方案,现在看起来很明显。我只需要在父(UpdateSet对象)和子(StatusInfo对象)之间的外键约束上启用级联删除。阅读有关在EF4.0中修改实体的文章我在一段中写了“在数据库和EF配置中打开或关闭级联删除”。在我的情况下,因为数据库是先创建的,所以这是关闭的,所以当我创建模型(代码优先)时,它也在EF中关闭。所以我猜在这种情况下我不得不手动删除所有孩子。说实话,因为我老了,我对此并不感到兴奋(限制级联删除),但我无法想象EF的其他方式。再次感谢大家。希望这有助于其他人。