2010-10-04 4 views
1

J'essaie de mapper mes entités en utilisant Entity Framework "code first", mais j'ai un problème avec le mappage d'un type complexe. Voici ma simplifié exampled:Mappage avec le framework d'entité "code first"

objet Domaine ressemble:

public class Customer 
{ 
    public Address DeliveryAddress {get; set;} 
} 

public class Address 
{ 
    public string StreetName {get; set;} 
    public string StreetNumber {get; set;} 
    public City City {get; set;} 
} 

public class City 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

et la mise en correspondance:

public class CustomerConfiguration : EntityConfiguration<Customer> 
{ 
    public CustomerConfiguration() 
    { 
     this.HasKey(b => b.Id); 
     this.Property(b => b.Id).IsIdentity(); 

     this.MapSingleType(x => new 
     { 
      Id = x.Id, 
      DeliveryAddress_StreetName = x.DeliveryAddress.StreetName, 
      DeliveryAddress_StreetNumber = x.DeliveryAddress.StreetNumber, 
      DeliveryAddress_CityId = x.DeliveryAddress.City.Id, // this line causes an exception 
     }).ToTable("Customer"); 
    } 
} 

public class AddressConfiguration : ComplexTypeConfiguration<Address> 
{ 
    public AddressConfiguration() 
    {   
     this.Property(b => b.StreetName).HasMaxLength(100).IsRequired().IsUnicode(); 
     this.Property(b => b.StreetNumber).HasMaxLength(6).IsRequired().IsUnicode(); 
} 

public class CityConfiguration : EntityConfiguration<City> 
{ 
    public CityConfiguration() 
    { 
     this.HasKey(b => b.Id); 
     this.Property(b => b.Id).IsIdentity(); 
     this.Property(b => b.Name).IsRequired().HasMaxLength(200).IsUnicode(); 

     this.MapSingleType(x => new 
     { 
      Id = x.Id, 
      Name = x.Name, 
     }).ToTable("City"); 
    } 
} 

L'exception qui est jeté est: « La clé donnée était absente dans le dictionnaire . '

Quelqu'un peut-il m'aider?

Répondre

1

Vous essayez d'ajouter un type d'entité de site à un type complexe. Ce n'est pas possible. Comme les entités, les types complexes sont constitués de propriétés scalaires ou d'autres propriétés de type complexe. Les types complexes ne disposant pas de clés, les objets de type complexe ne peuvent pas être gérés par Entity Framework en dehors de l'objet parent. Pour plus d'informations, consultez la page Complex type article.

+0

Merci pour la réponse! Donc, dans ce cas, je devrais faire un agrégat (ce qui n'a pas beaucoup de sens je suppose) ou je ne devrais pas inclure City in Address, mais plutôt CityId (qui peut fonctionner pour moi, je n'ai pas nécessairement besoin de l'objet City lui-même). –

+0

Autre chose: un type complexe peut-il être optionnel? Si j'attribue null à Adresse et l'enregistre, il génère une exception qu'il n'est pas nullable? –

+0

http://msdn.microsoft.com/en-us/library/bb738472.aspx: Les propriétés de type complexe ne peuvent pas être nulles. Une exception InvalidOperationException se produit lorsque SaveChanges est appelée et qu'un objet complexe null est rencontré. Je suppose que cela répond à ma question. Le problème est que j'ai une adresse qui est obligatoire et une autre adresse qui est facultative ... –

0

Votre configuration d'adresse ne connecte pas l'adresse à la ville.

+0

Je ne pense pas que je peux le faire en AddressConfiguration, parce qu'il hérite de ComplexTypeConfiguration

... ou ai-je tort? –

0

La référence de classe est prévue si vous souhaitez utiliser les propriétés de navigation Entity Frameworks. Pour ce faire, vous devez rendre les références de classe virtuelles. Donc, dans Address la propriété City devrait être virtuelle. De plus pour faciliter la mise (surtout si vous utilisez MVC), vous devez inclure la valeur d'identité sur le côté qui détient la référence comme celui-ci

public virtual City City {get; set;} 
public int CityId {get; set;} 
Questions connexes