0

2 つのエンティティがSearchありSearchTerm、多対多の関係があります。新しい を作成し、それに沿ってSearchを追加するList(Of SearchTerm)と、すべてが完全に機能します。既存の を使用しようとすると、次のSearchTermようにクラッシュします。

リレーションシップの外部キー プロパティを公開しないエンティティの保存中にエラーが発生しました。単一のエンティティを例外のソースとして識別できないため、EntityEntries プロパティは null を返します。保存中の例外の処理は、エンティティ タイプで外部キー プロパティを公開することで簡単に行うことができます。詳細については、InnerException を参照してください。

内部例外: INSERT ステートメントが FOREIGN KEY 制約 "FK_tblSearchesSearchTerms_tblSearchTerms" と競合しました。データベース「CASSAudits」、テーブル「dbo.tblSearchTerms」、列「SearchTermID」で競合が発生しました。ステートメントは終了されました。

サンプルコードは次のとおりです。

Dim foundTerm As SearchTerm = DataSource.SearchTerms.FirstOrDefault(Function(term) term.FieldName = "fieldName")

DataSource.Searches.Add(New Search() With {
    .Terms = New List(Of SearchTerm) From { foundTerm }
}
DataSource.SaveChanges()

ここにエンティティがあります

Public Class SearchTerm
    Public Property SearchTermID As Integer

    Public Overridable Property Searches As ICollection(Of Search)

    Public Property FieldName As String
    Public Property ComparisonType As String
    Public Property Value As String
End Class

Public Class Search
    Public Property SearchID As Integer

    Public Overridable Property Terms As ICollection(Of SearchTerm)

    Public Property FromPage As String
    Public Property SearchDate As Date
    Public Property User As String
End Class

多対多の関係は、次のOnModelCreatingようにカスタム マッピングされます。

    modelBuilder.Entity(Of Search) _
        .HasMany(Function(search) search.Terms) _
        .WithMany(Function(term) term.Searches) _
        .Map(Function(m) m.MapLeftKey("SearchTermID").MapRightKey("SearchID").ToTable("tblSearchesSearchTerms"))
4

1 に答える 1

0

Express Profilerの助けを借りて問題を発見しました。左と右のキーを逆方向にマッピングしたので、EF はSearchID新しい検索の をSearchTermIDリレーションシップの として追加しようとしました。

modelBuilder.Entity(Of Search) _
    .HasMany(Function(search) search.Terms) _
    .WithMany(Function(term) term.Searches) _
    .Map(Function(m) m.MapLeftKey("SearchID").MapRightKey("SearchTermID").ToTable("tblSearchesSearchTerms"))
于 2013-06-28T15:17:10.343 に答える