繁体   English   中英

多对多关系在子表之一上插入空FK记录

[英]Many to Many Relationships Inserting Null FK records on one of the child tables

我有一个具有这种结构的模型

1-桌

2-模型

3-桌

定义:Table MODEL与TABLEA具有一对多的关系Table MODEL与TABLEB具有一对多的关系TABLEA与TABLEB具有多对多的关系

这些表中的每一个都有这种Model定义:

    With modelBuilder.Entity(Of TABLEA)()
        .Property(Function(t) t.dbTableAID).
            HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
        .HasKey(Function(t) t.dbTableAID)
        .Property(Function(t) t.Name).
            HasColumnName("TableName")
        .ToTable("TI")

每种类型的定义如下:

Public Class Model

Public Sub New()
    Me.TableAs = New HashSet(Of TableA)()
    Me.TableBs = New HashSet(Of TableB)()
End Sub

Public Property model_id as integer

Public Overridable Property TableAs() As ICollection(Of TableA)
Public Overridable Property TableBs() As ICollection(Of TableB)

Public Sub LoadModel(Query)

      For Each objTableA In Query.cbsSrcCubes
        Dim objDb As TableA = New TableA()
        Me.TableAs.Add(objDbSrcCube.CastCubeToDB(objDb))
    Next

      For Each objTableB In Query.cbsSrcCubes
        Dim objDb As TableB = New TableB()
        Me.TableBs.Add(objDbSrcCube.CastCubeToDB(objDb))
    Next
End Sub

End Class


Public Class TableA

Public Sub New()
    Me.TableBs = New HashSet(Of TableB)()
End Sub

Public Property TableA_id as integer

Public Overridable Property Model() As Model
Public Overridable Property TableBs() As ICollection(Of TableB)

End Class

Public Class TableB

Public Sub New()
    Me.TableAs = New HashSet(Of TableA)()
End Sub

Public Property TableB_id as integer

Public Overridable Property Model() As Model
Public Overridable Property TableAs() As ICollection(Of TableA)

Public Sub LoadTableA(Query)
      For Each objTableA In Query.TableACol
        Dim objDb As TableA = New TableA()
        Me.TableAs.Add(objDb)
    Next
End Sub


End Class

这是上下文的定义

Public Class QDModelContext
Inherits DbContext

Public Property Models() As DbSet(Of Model)
Public Property TableAs() As DbSet(Of TableA)
Public Property TableBs() As DbSet(Of TableB)

Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
    modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()

    'Specific Features of the MODEL Objects
    With modelBuilder.Entity(Of Model)()
        .Property(Function(t) t.model_id).
            HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
        .HasKey(Function(t) t.model_id)
        .Property(Function(t) t.Name).
            HasColumnName("ModelName")
    End With

    With modelBuilder.Entity(Of TableA)()
        .Property(Function(t) t.tablea_id).
            HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
        .HasKey(Function(t) t.tablea_id)
        .Property(Function(t) t.Name).
            HasColumnName("TableAName")

        modelBuilder.Entity(Of TableA)().
            HasMany(Function(t) t.TableBs).
            WithMany(Function(t) t.TableAs).
        Map(Sub(m)
                m.ToTable("TableA-TableB")
                m.MapLeftKey("tablea_id")
                m.MapRightKey("tableb-id")
            End Sub)
    End With

    With modelBuilder.Entity(Of TableB)()
        .Property(Function(t) t.tableb_id).
            HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
        .HasKey(Function(t) t.tableb_id)
        .Property(Function(t) t.Name).
            HasColumnName("TableBName")
    End With

End Class

从主程序调用的保存例程:

    Public Function PersistModel(CurrentModel As Model)
        Try
            Using context As New QDModelContext()
                Dim ModelObj As Model = New Model()
                context.Models.Add(ModelObj)
                context.SaveChanges()
            End Using
        Catch ex As Exception
            buildError("Couldn't Persist Model.", ex.Source & ": " & Err.Description, ex)
        End Try
    End Function

我尝试正确定义FK关系,并遇到以下错误:

        modelBuilder.Entity(Of TableB)().
            HasRequired(Function(t) t.Model).
            WithMany(Function(t) t.TableBs).
        Map(Sub(m)
                m.MapKey("ModelID_FK")
            End Sub)

它工作正常……但是,一旦我添加了多对多关系,它就会说它无法将某些对象从TableA映射到模型。

因此,如果我将其设置为Optional:

        modelBuilder.Entity(Of TableB)().
            HasOPTIONAL(Function(t) t.Model).
            WithMany(Function(t) t.TableBs).
        Map(Sub(m)
                m.MapKey("ModelID_FK")
            End Sub)

它工作正常,它创建了联接表TableA-TableB,但它在表B中添加了ModelID_FK空值的几行重复项...我认为是表B中不存在的表A-表B B值的关系。 。

我想知道这是否与实体之间的加载顺序或某个周期或顺序有关...

任何帮助将不胜感激。 谢谢!!!

我认为问题与多对多的加载有关

每个表A和B都有一个标识列,它是键。 当我加载表AI时,将加载B项的集合。 并且表B被加载。

当我将更改另存为HasOptional时,所有表A项都映射到多对多表A和表B中,并且表B具有所有表B项和连接表中存在的所有B项,但具有模型的NULL外键。

因此,不会映射到多对多的一侧。

因此,我认为将TableB项加载到A中的时间存在问题。当我保存更改时,Join表上的表B项不被识别为存在,因此不与现有项映射...这就是EF创建的原因表B中的那些新条目,以将它们映射到某物。

如果将外键从模型更改为表B到HasRequired,则会出现以下错误:

Entities in 'Context.TableB' participate in the 'TableB_Model' relationship. 0 related 'TableB_Model_Target' were found. 1 'TableB_Model_Target' is expected."}

我越来越近了,但是还没到。 任何帮助,将不胜感激!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM