1

この構造のモデルがあります

1 -テーブル

2 - モデル

3 -テーブルB

定義: 表 MODEL は TABLEA と 1 対多の関係にあります 表 MODEL は TABLEB と 1 対多の関係にあります TABLEA は TABLEB と多対多の関係にあります

これらの各テーブルには、次のようなモデル定義があります。

    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

Main から呼び出される保存ルーチン:

    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からModelに一部のオブジェクトをマップできないと表示されます。

したがって、これをオプションに設定すると:

        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を作成しますが、ModelID_FK null値を持つテーブルBにいくつかの行の重複を追加します...テーブルBに存在しない関係TableA-TableB Bの値のものだと思います.奇妙な.. .

エンティティ間のロード順序または何らかのサイクルまたは順序に関係しているのだろうか...

どんな助けでも大歓迎です。ありがとう!!!

4

0 に答える 0