2012-04-27 7 views
0

J'ai deux objets d'entité:plusieurs à plusieurs EF

public class Contact 
    { 
     public int ContactID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 

     public ICollection<Friend> Friends { get; set; } 

    } 

et ami:

public class Friend 
{ 
    [Key, Column(Order = 1)] 
    public int ContactId1 { get; set; } 
    [Key, Column(Order = 1)] 
    public int ContactId2 { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

où ContactId1 cartes retour à une ContactID et ContactId2 cartes retour à un autre contactID.

Comment est-ce que je m'assure que l'est généré avec les bonnes relations?

+0

double possible de [Many-to -Beaucoup de relation dans Code-First EF4] (http://stackoverflow.com/questions/3148844/many-to-many-relationship-in-code-first-ef4) – StriplingWarrior

Répondre

0

Je pense que vous voulez deux rangées d'ami se référant à deux sur le contact, non? Si oui, vous devez créer deux instances d'ami. Le code de structure d'entité reconnaît d'abord les relations de clé par le nom de votre propriété. Donc dans votre classe Friend la propriété doit noms ContactId car l'entité est des noms Contact.

public class Contact 
{ 
    public int ContactID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 

    public ICollection<Friend> Friends { get; set; } 

} 

public class Friend 
{ 
    public int ContactId { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

Modifier

Si vous voulez un ami ont beaucoup de contacts que vous avez besoin d'une table de relation.

public class Contact 
{ 
    public int ContactID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 

    public ICollection<Friend> Friends { get; set; } 

} 

public class Friend 
{ 
    public int FriendId { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

public class FriendContactRel 
{ 
    [Key, Column(Order = 0)] 
    public int ContactID { get; set; } 
    [Key, Column(Order = 1)] 
    public int FriendId { get; set; } 
} 
+0

dknaack, qu'est-ce que je veux? associé à deux contacts? Si je concevais la base de données, ContactId1 pointerait vers la table Contact et ContactId2 pointerait également vers la table des contacts. –

+0

c'est possible avec ma solution. – dknaack

+0

Mes solutions disent ... il n'est pas possible d'avoir deux lignes avec le même ami et le même contact est possible. Vous pouvez avoir plusieurs amis pour avoir le même contact et plusieurs contacts pour avoir les mêmes amis. Thats beaucoup à beaucoup – dknaack

2

Vous devez prolonger votre Friend classe:

public class Friend 
{ 
    [Key, Column(Order = 0), ForeignKey("Contact1")] 
    public int ContactId1 { get; set; } 
    public Contact Contact1 { get; set; } 

    [Key, Column(Order = 1), ForeignKey("Contact2")] 
    public int ContactId2 { get; set; } 
    public Contact Contact2 { get; set; } 

    public DateTime DateCreated { get; set; } 
} 

Et ajouter un attribut à la collection Friends dans Contact:

[InverseProperty("Contact1")] 
public ICollection<Friend> Friends { get; set; } 

(Vous pouvez également utiliser l'API Fluent au lieu des annotations

Le résultat est deux one-to-many relations (vous ne pouvez pas mapper ce modèle entre plusieurs-à-plusieurs). Le premier est compris entre Contact.Friends et Friend.Contact1 et le second a Friend.Contact2 en tant que point d'extrémité. Le point d'extrémité dans Friend n'est pas exposé dans le modèle.

Vous pouvez ensuite interroger par exemple pour tous les contacts d'ami d'un contact donné créé avant aujourd'hui:

DateTime today = DateTime.Now.Date; 
IEnumerable<Contact> friendContacts = context.Contacts 
    .Where(c => c.ContactId == givenId) 
    .Select(c => c.Friends 
     .Where(f => f.DateCreated < today) 
     .Select(f => f.Contact2)) 
    .SingleOrDefault(); 

Eit

Le mappage ne fonctionne pas au-dessus parce Friend a deux relations nécessaires à Contact. Par défaut, pour les relations un-à-plusieurs requises, EF active la suppression en cascade qui n'est pas autorisée pour deux relations en même temps. Nous avons besoin de réécrire la mise en correspondance avec l'API Fluent pour désactiver suppression en cascade, car cela est impossible avec annotations de données:

public class Contact 
{ 
    public int ContactID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 

    public ICollection<Friend> Friends { get; set; } 
} 

public class Friend 
{ 
    public int ContactID1 { get; set; } 
    public Contact Contact1 { get; set; } 

    public int ContactID2 { get; set; } 
    public Contact Contact2 { get; set; } 

    public DateTime DateCreated { get; set; } 
} 

redéfinissent Puis OnModelCreating dans votre contexte dérivé:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Friend>() 
     .HasKey(f => new { f.ContactID1, f.ContactID2 }); 

    modelBuilder.Entity<Friend>() 
     .HasRequired(f => f.Contact1) 
     .WithMany(c => c.Friends) 
     .HasForeignKey(f => f.ContactID1); 

    modelBuilder.Entity<Friend>() 
     .HasRequired(f => f.Contact2) 
     .WithMany() 
     .HasForeignKey(f => f.ContactID2) 
     .WillCascadeOnDelete(false); // <- Important 
} 
+0

Thanks Slauma- mais une erreur se produit lors de l'exécution de mon application - Exception non gérée: System .InvalidOperationException: La création de la base de données a réussi, mais pas la création des objets de base de données. Voir l'exception interne pour plus de détails. ---> System.Data.SqlServerCe.SqlCeException: Le référentiel rel aura pour résultat une référence cyclique non autorisée. [Nom de la contrainte = Contact_Friends] .. pensées? –

+0

@ek_ny: Voir mon Edit ci-dessus. Je ne suis pas sûr si cela va résoudre le problème, laissez-moi savoir si cela fonctionne. – Slauma

Questions connexes