この構造のモデルがあります
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の値のものだと思います.奇妙な.. .
エンティティ間のロード順序または何らかのサイクルまたは順序に関係しているのだろうか...
どんな助けでも大歓迎です。ありがとう!!!