2013-06-28 9 views
0

J'ai deux entités, Search et SearchTerm avec plusieurs à plusieurs. Lorsque je crée un nouveau Search et que j'y ajoute un List(Of SearchTerm), tout fonctionne parfaitement. Si je tente d'utiliser une plante il SearchTerm, déjà existant:Ajouter des entités liées à plusieurs à plusieurs (EF 4.1)

Une erreur est survenue lors de l'enregistrement des entités qui ne pas exposer les propriétés clés étrangères pour leurs relations. La propriété EntityEntries renvoie null car une seule entité ne peut pas être identifiée comme source de l'exception. La gestion des exceptions lors de l'enregistrement peut être facilitée en exposant les propriétés de clé étrangère dans vos types d'entité. Voir l'exception interne pour plus de détails.

Exception interne: L'instruction INSERT était en conflit avec la contrainte FOREIGN KEY "FK_tblSearchesSearchTerms_tblSearchTerms". Le conflit s'est produit dans la base de données "CASSAudits", table "dbo.tblSearchTerms", colonne "SearchTermID". La déclaration a été terminée.

est ici un exemple de code:

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() 

Voici les entités

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 

La relation plusieurs à plusieurs est mise en correspondance personnalisée dans OnModelCreating comme ceci:

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

Répondre

0

trouvé le problème avec l'aide de Express Profiler. J'ai mappé les touches gauche et droite en arrière afin que EF essayait d'ajouter le SearchID de la nouvelle recherche en tant que SearchTermID de la relation.

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