Première nouveauté avec VS 2010 Beta, les complex properties dans le designer (ici Address) sont supportés, même si le fait de ne pas avoir le complex type dans le designer (en dehors de la fenêtre Model Browser) est à mon avis dommage. // Si on rajoute à cela le non support des mappings TPC et de l’Horizontal Entity Splitting, je pense que mon EDM Designer devrait continuer d’être intéressant (en attendant VS 2012). Matthieu 1 - ADO .NET Team 0 
Pour réaliser mon exemple, je suis parti sur une approche Model First. C’est à dire que j’ai d’abord créer mon modèle d’entités et que je lui ai ensuite demandé de me générer la base qui va bien à partir de celles-ci. C’est est également une nouveauté de la V2. // A noter que je préfère l’approche dans laquelle le DBA conçoit la base et l’architecte conçoit les entités, le tout indépendamment. Ensuite, il suffit d’utiliser la puissance du mapping d’EDM pour mapper les deux conceptions (objet et relationnel).
Bref, revenons à nos moutons ou plutôt à nos entités. 
Avec le code généré par défaut (avec ou sans le template T4), les entités générées sont des entités Prescriptive classes (ie : devant hériter des classes de base du Framework).
using System;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Data.EntityClient;
using System.ComponentModel;
using System.Xml.Serialization;
using System.Runtime.Serialization;
[assembly: EdmSchemaAttribute()]
#region EDM Relationship Metadata
[assembly: EdmRelationshipAttribute("Test", "CategoryProduct", "Category", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(ConsoleApplication1.Category), "Product", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(ConsoleApplication1.Product))]
[assembly: EdmRelationshipAttribute("Test", "SupplierProduct", "Supplier", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(ConsoleApplication1.Supplier), "Product", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(ConsoleApplication1.Product))]
#endregion
namespace ConsoleApplication1
{
#region Contexts
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public partial class TestContainer : ObjectContext
{
#region Constructors
/// <summary>
/// Initializes a new TestContainer object using the connection string found in the 'TestContainer' section of the application configuration file.
/// </summary>
public TestContainer()
: base("name=TestContainer", "TestContainer")
{
OnContextCreated();
}
/// <summary>
/// Initialize a new TestContainer object.
/// </summary>
public TestContainer(string connectionString)
: base(connectionString, "TestContainer")
{
OnContextCreated();
}
/// <summary>
/// Initialize a new TestContainer object.
/// </summary>
public TestContainer(EntityConnection connection)
: base(connection, "TestContainer")
{
OnContextCreated();
}
#endregion
#region Partial Methods
partial void OnContextCreated();
#endregion
#region ObjectSet Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Category> Categories
{
get
{
if ((_Categories == null))
{
_Categories = base.CreateObjectSet<Category>("Categories");
}
return _Categories;
}
}
private ObjectSet<Category> _Categories;
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Product> Products
{
get
{
if ((_Products == null))
{
_Products = base.CreateObjectSet<Product>("Products");
}
return _Products;
}
}
private ObjectSet<Product> _Products;
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Supplier> Suppliers
{
get
{
if ((_Suppliers == null))
{
_Suppliers = base.CreateObjectSet<Supplier>("Suppliers");
}
return _Suppliers;
}
}
private ObjectSet<Supplier> _Suppliers;
#endregion
#region AddTo Methods
/// <summary>
/// Deprecated Method for adding a new object to the Categories EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.
/// </summary>
public void AddToCategories(Category category)
{
base.AddObject("Categories", category);
}
/// <summary>
/// Deprecated Method for adding a new object to the Products EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.
/// </summary>
public void AddToProducts(Product product)
{
base.AddObject("Products", product);
}
/// <summary>
/// Deprecated Method for adding a new object to the Suppliers EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.
/// </summary>
public void AddToSuppliers(Supplier supplier)
{
base.AddObject("Suppliers", supplier);
}
#endregion
}
#endregion
#region Entities
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName = "Test", Name = "Category")]
[Serializable()]
[DataContractAttribute(IsReference = true)]
public partial class Category : EntityObject
{
#region Factory Method
/// <summary>
/// Create a new Category object.
/// </summary>
/// <param name="id">Initial value of the Id property.</param>
/// <param name="name">Initial value of the Name property.</param>
/// <param name="description">Initial value of the Description property.</param>
public static Category CreateCategory(global::System.Int32 id, global::System.String name, global::System.String description)
{
Category category = new Category();
category.Id = id;
category.Name = name;
category.Description = description;
return category;
}
#endregion
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
[DataMemberAttribute()]
public global::System.Int32 Id
{
get
{
return _Id;
}
set
{
if (Id != value)
{
OnIdChanging(value);
ReportPropertyChanging("Id");
_Id = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Id");
OnIdChanged();
}
}
}
private global::System.Int32 _Id;
partial void OnIdChanging(global::System.Int32 value);
partial void OnIdChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String Name
{
get
{
return _Name;
}
set
{
OnNameChanging(value);
ReportPropertyChanging("Name");
_Name = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("Name");
OnNameChanged();
}
}
private global::System.String _Name;
partial void OnNameChanging(global::System.String value);
partial void OnNameChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String Description
{
get
{
return _Description;
}
set
{
OnDescriptionChanging(value);
ReportPropertyChanging("Description");
_Description = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("Description");
OnDescriptionChanged();
}
}
private global::System.String _Description;
partial void OnDescriptionChanging(global::System.String value);
partial void OnDescriptionChanged();
#endregion
#region Navigation Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("Test", "CategoryProduct", "Product")]
public EntityCollection<Product> Products
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Product>("Test.CategoryProduct", "Product");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Product>("Test.CategoryProduct", "Product", value);
}
}
}
#endregion
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName = "Test", Name = "Product")]
[Serializable()]
[DataContractAttribute(IsReference = true)]
public partial class Product : EntityObject
{
#region Factory Method
/// <summary>
/// Create a new Product object.
/// </summary>
/// <param name="id">Initial value of the Id property.</param>
/// <param name="name">Initial value of the Name property.</param>
public static Product CreateProduct(global::System.Int32 id, global::System.String name)
{
Product product = new Product();
product.Id = id;
product.Name = name;
return product;
}
#endregion
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
[DataMemberAttribute()]
public global::System.Int32 Id
{
get
{
return _Id;
}
set
{
if (Id != value)
{
OnIdChanging(value);
ReportPropertyChanging("Id");
_Id = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Id");
OnIdChanged();
}
}
}
private global::System.Int32 _Id;
partial void OnIdChanging(global::System.Int32 value);
partial void OnIdChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String Name
{
get
{
return _Name;
}
set
{
OnNameChanging(value);
ReportPropertyChanging("Name");
_Name = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("Name");
OnNameChanged();
}
}
private global::System.String _Name;
partial void OnNameChanging(global::System.String value);
partial void OnNameChanged();
#endregion
#region Navigation Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("Test", "CategoryProduct", "Category")]
public Category Category
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("Test.CategoryProduct", "Category").Value;
}
set
{
((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("Test.CategoryProduct", "Category").Value = value;
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[BrowsableAttribute(false)]
[DataMemberAttribute()]
public EntityReference<Category> CategoryReference
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("Test.CategoryProduct", "Category");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Category>("Test.CategoryProduct", "Category", value);
}
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("Test", "SupplierProduct", "Supplier")]
public Supplier Supplier
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("Test.SupplierProduct", "Supplier").Value;
}
set
{
((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("Test.SupplierProduct", "Supplier").Value = value;
}
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[BrowsableAttribute(false)]
[DataMemberAttribute()]
public EntityReference<Supplier> SupplierReference
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("Test.SupplierProduct", "Supplier");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Supplier>("Test.SupplierProduct", "Supplier", value);
}
}
}
#endregion
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName = "Test", Name = "Supplier")]
[Serializable()]
[DataContractAttribute(IsReference = true)]
public partial class Supplier : EntityObject
{
#region Factory Method
/// <summary>
/// Create a new Supplier object.
/// </summary>
/// <param name="id">Initial value of the Id property.</param>
/// <param name="companyName">Initial value of the CompanyName property.</param>
/// <param name="address">Initial value of the Address property.</param>
public static Supplier CreateSupplier(global::System.Int32 id, global::System.String companyName, Address address)
{
Supplier supplier = new Supplier();
supplier.Id = id;
supplier.CompanyName = companyName;
supplier.Address = StructuralObject.VerifyComplexObjectIsNotNull(address, "Address");
return supplier;
}
#endregion
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
[DataMemberAttribute()]
public global::System.Int32 Id
{
get
{
return _Id;
}
set
{
if (Id != value)
{
OnIdChanging(value);
ReportPropertyChanging("Id");
_Id = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Id");
OnIdChanged();
}
}
}
private global::System.Int32 _Id;
partial void OnIdChanging(global::System.Int32 value);
partial void OnIdChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String CompanyName
{
get
{
return _CompanyName;
}
set
{
OnCompanyNameChanging(value);
ReportPropertyChanging("CompanyName");
_CompanyName = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("CompanyName");
OnCompanyNameChanged();
}
}
private global::System.String _CompanyName;
partial void OnCompanyNameChanging(global::System.String value);
partial void OnCompanyNameChanged();
#endregion
#region Complex Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmComplexPropertyAttribute()]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[XmlElement(IsNullable = true)]
[SoapElement(IsNullable = true)]
[DataMemberAttribute()]
public Address Address
{
get
{
_Address = GetValidValue(_Address, "Address", false, _AddressInitialized);
_AddressInitialized = true;
return _Address;
}
set
{
OnAddressChanging(value);
ReportPropertyChanging("Address");
_Address = SetValidValue(_Address, value, "Address");
_AddressInitialized = true;
ReportPropertyChanged("Address");
OnAddressChanged();
}
}
private Address _Address;
private bool _AddressInitialized;
partial void OnAddressChanging(Address value);
partial void OnAddressChanged();
#endregion
#region Navigation Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("Test", "SupplierProduct", "Product")]
public EntityCollection<Product> Products
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Product>("Test.SupplierProduct", "Product");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Product>("Test.SupplierProduct", "Product", value);
}
}
}
#endregion
}
#endregion
#region ComplexTypes
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmComplexTypeAttribute(NamespaceName = "Test", Name = "Address")]
[DataContractAttribute(IsReference = true)]
[Serializable()]
public partial class Address : ComplexObject
{
#region Factory Method
/// <summary>
/// Create a new Address object.
/// </summary>
/// <param name="addressLine">Initial value of the AddressLine property.</param>
/// <param name="postalCode">Initial value of the PostalCode property.</param>
/// <param name="city">Initial value of the City property.</param>
/// <param name="region">Initial value of the Region property.</param>
/// <param name="country">Initial value of the Country property.</param>
public static Address CreateAddress(global::System.String addressLine, global::System.String postalCode, global::System.String city, global::System.String region, global::System.String country)
{
Address address = new Address();
address.AddressLine = addressLine;
address.PostalCode = postalCode;
address.City = city;
address.Region = region;
address.Country = country;
return address;
}
#endregion
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String AddressLine
{
get
{
return _AddressLine;
}
set
{
OnAddressLineChanging(value);
ReportPropertyChanging("AddressLine");
_AddressLine = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("AddressLine");
OnAddressLineChanged();
}
}
private global::System.String _AddressLine;
partial void OnAddressLineChanging(global::System.String value);
partial void OnAddressLineChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String PostalCode
{
get
{
return _PostalCode;
}
set
{
OnPostalCodeChanging(value);
ReportPropertyChanging("PostalCode");
_PostalCode = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("PostalCode");
OnPostalCodeChanged();
}
}
private global::System.String _PostalCode;
partial void OnPostalCodeChanging(global::System.String value);
partial void OnPostalCodeChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String City
{
get
{
return _City;
}
set
{
OnCityChanging(value);
ReportPropertyChanging("City");
_City = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("City");
OnCityChanged();
}
}
private global::System.String _City;
partial void OnCityChanging(global::System.String value);
partial void OnCityChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String Region
{
get
{
return _Region;
}
set
{
OnRegionChanging(value);
ReportPropertyChanging("Region");
_Region = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("Region");
OnRegionChanged();
}
}
private global::System.String _Region;
partial void OnRegionChanging(global::System.String value);
partial void OnRegionChanged();
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String Country
{
get
{
return _Country;
}
set
{
OnCountryChanging(value);
ReportPropertyChanging("Country");
_Country = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("Country");
OnCountryChanged();
}
}
private global::System.String _Country;
partial void OnCountryChanging(global::System.String value);
partial void OnCountryChanged();
#endregion
}
#endregion
}
using System;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Data.EntityClient;
using System.ComponentModel;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Collections.Generic;
namespace ConsoleApplication1
{
#region Contexts
public interface ITestContainer
{
IObjectSet<Category> Categories { get; }
IObjectSet<Product> Products { get; }
IObjectSet<Supplier> Suppliers { get; }
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public partial class TestContainer : ObjectContext, ITestContainer
{
#region Constructors
/// <summary>
/// Initializes a new TestContainer object using the connection string found in the 'TestContainer' section of the application configuration file.
/// </summary>
public TestContainer()
: base("name=TestContainer", "TestContainer")
{
OnContextCreated();
}
/// <summary>
/// Initialize a new TestContainer object.
/// </summary>
public TestContainer(string connectionString)
: base(connectionString, "TestContainer")
{
OnContextCreated();
}
/// <summary>
/// Initialize a new TestContainer object.
/// </summary>
public TestContainer(EntityConnection connection)
: base(connection, "TestContainer")
{
OnContextCreated();
}
#endregion
#region Partial Methods
partial void OnContextCreated();
#endregion
#region ObjectSet Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Category> Categories
{
get
{
if (_Categories == null)
_Categories = CreateObjectSet<Category>("Categories");
return _Categories;
}
}
private ObjectSet<Category> _Categories;
IObjectSet<Category> ITestContainer.Categories { get { return Categories; } }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Product> Products
{
get
{
if (_Products == null)
_Products = CreateObjectSet<Product>("Products");
return _Products;
}
}
private ObjectSet<Product> _Products;
IObjectSet<Product> ITestContainer.Products { get { return Products; } }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Supplier> Suppliers
{
get
{
if (_Suppliers == null)
_Suppliers = CreateObjectSet<Supplier>("Suppliers");
return _Suppliers;
}
}
private ObjectSet<Supplier> _Suppliers;
IObjectSet<Supplier> ITestContainer.Suppliers { get { return Suppliers; } }
#endregion
#region AddTo Methods
/// <summary>
/// Deprecated Method for adding a new object to the Categories EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.
/// </summary>
public void AddToCategories(Category category)
{
base.AddObject("Categories", category);
}
/// <summary>
/// Deprecated Method for adding a new object to the Products EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.
/// </summary>
public void AddToProducts(Product product)
{
base.AddObject("Products", product);
}
/// <summary>
/// Deprecated Method for adding a new object to the Suppliers EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.
/// </summary>
public void AddToSuppliers(Supplier supplier)
{
base.AddObject("Suppliers", supplier);
}
#endregion
}
#endregion
#region Entities
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataContractAttribute(IsReference = true)]
public partial class Category
{
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public Int32 Id { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String Name { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String Description { get; set; }
#endregion
#region Navigation Properties
private List<Product> _products;
[DataMemberAttribute()]
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public virtual List<Product> Products
{
get
{
if (_products == null)
_products = new List<Product>();
return _products;
}
set { _products = value; }
}
#endregion
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataContractAttribute(IsReference = true)]
public partial class Product
{
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public Int32 Id { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String Name { get; set; }
#endregion
#region Navigation Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual Category Category { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual Supplier Supplier { get; set; }
#endregion
}
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataContractAttribute(IsReference = true)]
public partial class Supplier
{
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public Int32 Id { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String CompanyName { get; set; }
#endregion
#region Complex Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual Address Address { get; set; }
#endregion
#region Navigation Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
private List<Product> _products;
public virtual List<Product> Products
{
get
{
if (_products == null)
_products = new List<Product>();
return _products;
}
set { _products = value; }
}
#endregion
}
#endregion
#region ComplexTypes
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataContractAttribute(IsReference = true)]
public partial class Address
{
#region Primitive Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String AddressLine { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String PostalCode { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String City { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String Region { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[DataMemberAttribute()]
public virtual String Country { get; set; }
#endregion
}
#endregion
}
Deuxième point, les entités n’ont plus de lien avec EF.
Troisième point, à la manière d'NHibernate, le fait de déclarer une propriété virtual va permettre de bénéficier du tracking automatique des modifications.
Enfin, pour finir ce post, dans mes tests, j’ai utilisé une autre nouveauté d’EF4 : le lazy loading. Pour cela, il suffit de le spécifier dans les options du contexte :