J'ai essayé de lire le msdn article sur les types complexes. Mais cela n'explique pas quand l'utiliser. De plus, il n'y a pas d'explication complète sur le Web sur les types complexes et quand les utiliser.
La longue explication se trouve dans l'article MSDN que vous avez lié ... vous voulez donc une explication simple:
Un type complexe est un ensemble de propriétés qui existent dans son propre objet pour C #, mais qui sont mappées à des colonnes sur une table déjà existante (celle de l'entité qui le contient), au lieu d'avoir sa propre table (qui aurait besoin d'une clé , etc.).
Imaginez donc que vous vouliez cette table dans la base de données:
Orders
----------
Id (bigint)
Name (varchar)
Street (varchar)
Region (varchar)
Country (varchar)
Mais voulons cette structure dans les entités C #:
class Order
{
long Id;
string Name;
struct Address
{
string Street;
string Region;
string Country;
}
}
Il y aurait donc Address
un type complexe: il n'existerait pas seul (il n'y aurait pas de table Addresses
) dans la base de données ... il n'existerait que sous la forme d'un ensemble de colonnes sur la table Orders
.
Comme indiqué par @HenkHolterman dans les commentaires, la valeur d'avoir des types complexes est d'avoir une seule entité C # qui peut être utilisée comme valeur pour d'autres entités contenant (dans mon exemple, vous pourriez avoir un Address
dans un Supplier
entité, par exemple, mais elle sera simplement mappée comme un ensemble de colonnes dans la table Suppliers
). Cela facilite le travail avec les valeurs du type complexe.
L'inconvénient est précisément celui-là: vous devrez peut-être répéter les valeurs de type complexe plusieurs fois dans la base de données s'il arrive qu'un même Address
(ou tout autre type que vous utilisez) puisse être partagé entre différentes entités.
Que vous choisissiez de travailler avec des types complexes ou des entités distinctes, cela dépend de vous et de votre conception.
Considérez cette classe ContactDetails
par exemple:
public class ContactDetails
{
public string HomePhone { get; set; }
public string MobilePhone { get; set; }
public string FaxNumber { get; set; }
}
Par défaut, EF traitera ContactDetails
comme une entité . Cela signifie que si (par exemple) vous avez une classe Person
avec une propriété de navigation de type ContactDetails
, EF mappera le Person.ContactDetails
relation avec une autre table (car Entité est quelque chose qui a une identité propre, par conséquent, d'autres entités peuvent s'y référer - et cela nécessiterait un tableau différent en termes relationnels).
En désignant ContactDetails
comme un type complexe , EF ne le traitera plus comme une entité qui nécessite une relation et le mappera à la même table de l'entité parent (contenant) (Person
dans mon exemple), ce qui en fait un Value Object .