2015-04-26 1 views
0

EF 6 (code d'abord) prend en charge les mappages de collection de types complexes? Je sais qu'il prend en charge les types complexes, mais n'a pas encore trouvé un exemple où nous avons une collection de types complexes. Par exemple, supposons que vous ayez une entité appelée Student, qui possède une collection de contacts. Avec NH, je peux simplement dire que Student a une collection de contacts et que le contact est un composant (équivalent à un type complexe dans ef). Est-ce que cela peut être fait avec EF sans changer de contact avec une entité?EF 6: mappage de la collection de types complexes?

merci.

Luis

+0

Je ne sais pas NH mais dans EF vous pouvez simplement déclarer une relation X-to-X qui fait ce que vous voulez, oui. Cependant, je ne suis pas sûr de ce que vous voulez dire par «sans changer de contact avec une entité». –

+0

Bonjour Jeroen. Je crois comprendre que lorsque vous mappez un objet à une table en utilisant EF, vous devez spécifier une clé primaire, n'est-ce pas? Je ne veux pas faire cela à Contact parce que comme je l'ai dit, il se comporte comme un objet de valeur, pas comme une entité –

+0

Oui, les PK sont généralement requis [bien qu'il semble y avoir une solution de contournement] (http://stackoverflow.com/ questions/3996782/entity-framework-table-without-primary-key). Bien que je réitère le conseil donné là-bas: il suffit de définir une clé et vous éviterez tous les tracas. Y a-t-il un avantage à omettre cela? –

Répondre

1

types complexes sont mis en correspondance avec la table de l'entité en ajoutant simplement une colonne pour chaque propriété du type complexe. Donc, avec contact comme une entité distincte:

public class Student 
{ 
    [Key] 
    public int ID {get; set;} 
    public Contact PrimaryContact { get; set; } 
    public Contact SecondaryContact{ get; set; } 
} 

[ComplexType] 
public class Contact 
{ 
    public string Address{get; set;} 
    public string PhoneNumber{get; set;} 
    public string Email{get; set;} 
} 

produira une cartographie d'une table d'un élève qui a des colonnes:

ID 
PrimaryContact_Address 
PrimaryContact_PhoneNumber 
PrimaryContact_Email 
SecondaryContact_Address 
SecondaryContact_PhoneNumber 
SecondaryContact_Email 

types complexes sont juste un raccourci pour déclarer les mêmes membres où que vous soyez. Vous pouvez utiliser ce même type de contact dans un groupe d'autres entités qui ont besoin de données de contact sans avoir à définir explicitement les propriétés Address, PhoneNumber et Email pour chaque entité. Vous ne pouvez donc pas vraiment les utiliser dans une collection, car chaque fois que vous vouliez ajouter ou supprimer des éléments, vous deviez ajouter ou supprimer des colonnes de la table elle-même.

public class Student 
{ 
    [Key] 
    public int ID {get; set;} 
    public ICollection<Contact> Contacts{ get; set; } 
} 

[ComplexType] 
public class Contact 
{ 
    public string Address{get; set;} 
    public string PhoneNumber{get; set;} 
    public string Email{get; set;} 
} 

ID 
Contacts[x]_Address? 
Contacts[x]_PhoneNumber? 
Contacts[x]_Email? 

Où les éléments de contacts peuvent-ils être stockés? Comment pourriez-vous l'indexer? Si vous essayez de le faire, le mapper ignorerait tout simplement la propriété Contacts.

Vous pouvez utiliser les collections de manière propre en supprimant simplement ComplexType de la classe Contact. Cela créerait une table dans la base de données, cependant:

public class Student 
{ 
    [Key] 
    public int ID {get; set;} 
    public ICollection<Contact> Contacts{ get; set; } 
} 

public class Contact 
{ 
    [Key] 
    public int ID {get; set;} 
    public string Address{get; set;} 
    public string PhoneNumber{get; set;} 
    public string Email{get; set;} 
} 
+0

Le mappage d'un type à une table est la responsabilité de l'ORM. C'est dommage que EF fuit tellement dans un domaine existant. Et en ce qui concerne votre question, je ne sais pas sur quelle est la confusion ici.Si A est un type qui a une propriété qui fait référence à une collection de B et B est un objet de valeur (type complexe), il est évident que B n'a même pas besoin de suivre l'ID de sa table correspondante, n'est-ce pas? NH le fait vraiment bien (http://nhibernate.info/doc/nhibernate-reference/components.html) ... –

+0

Ce sont des questions rhétoriques. :) Ils ne peuvent tout simplement pas être répondu et illustrent pourquoi vous ne pouvez pas avoir des collections de types complexes. Pour faire ce que vous demandez, vous devez créer une entité de contact séparée pour mapper à une table afin de stocker chaque élément. Cette page que vous avez liée montre seulement comment avoir des collections dans un élément composite, pas comment avoir des collections d'éléments composites. – user8684119

+0

En fait, vous ne pouvez pas avoir de collections de types de valeur en général. Vous POUVEZ stocker une collection sérialisée dans une seule propriété, mais ce serait absurde en ce qui concerne la pureté. Vous pouvez avoir des collections de l'entité B dans l'entité A car chaque élément B est stocké dans la table de B en tant que ligne distincte avec son propre ID. Cet ID est ce qui est stocké dans A. Cette page mentionne uniquement les collections DANS les éléments composites, pas les collections d'éléments composites. Je ne sais rien à propos de NHibernate, mais il faudrait qu'il y ait une place pour placer les objets de B dans un tableau séparé. Ce qui serait la même chose qu'une autre entité EF. – user8684119