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;}
}
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é». –
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é –
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? –