6

Existe-t-il un moyen d'avoir plusieurs instances de type complexe à l'intérieur du même modèle à l'aide du générateur de modèle api Fluent?Entity framework complex type plusieurs instances dans un modèle?

public class Contact 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public Address PersonalAddress { get; set; } 
    public Address BusinessAddress { get; set; } 
} 

public class Address 
{ 
    public string Street{ get; set; } 
    public string City{ get; set; } 
    public string PostalCode{ get; set; } 
} 


protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Configurations.Add(new ContactConfiguration()); 
    modelBuilder.Configurations.Add(new AddressConfiguration()); 
} 

=========================================== =======================================

public class AddressConfiguration : ComplexTypeConfiguration<Address> 
{ 
    public AddressConfiguration() 
    { 

     //props 
     this.Property(t => t.Street) 
      .IsOptional() 
      .HasColumnName("AddressStreet") 
      .HasMaxLength(1024); 

     this.Property(t => t.PostalCode) 
      .IsOptional() 
      .HasColumnName("AddressPostalCode") 
      .HasMaxLength(64); 

     this.Property(t => t.City) 
      .IsOptional() 
      .HasColumnName("AddressCity") 
      .HasMaxLength(512); 
    } 
} 

EDIT (TROUVE lA SOLUTION)

Si plusieurs instances de classe de type complexe sont utilisés dans la même modèle CF, la configuration de ces classes est fixé au niveau modèle CF comme celui-ci:

public class ContactConfiguration : EntityTypeConfiguration<Contact> 
{ 
    public ContactConfiguration() 
    { 

     //props for PersonalAddress instance of Address complex type class 
     this.Property(t => t.PersonalAddress.Address.Street) 
      .HasColumnName("PersonalAddressStreet"); 

     this.Property(t => t.PersonalAddress.Address.PostalCode) 
      .HasColumnName("PersonalAddressPostalCode"); 

     this.Property(t => t.PersonalAddress.Address.City) 
      .HasColumnName("PersonalAddressCity"); 


     //props for BusinessAddress instance of Address complex type class 
     this.Property(t => t.BusinessAddress.Address.Street) 
      .HasColumnName("BusinessAddressStreet"); 

     this.Property(t => t.BusinessAddress.Address.PostalCode) 
      .HasColumnName("BusinessAddressPostalCode"); 

     this.Property(t => t.BusinessAddress.Address.City) 
      .HasColumnName("BusinessAddressCity"); 
    } 
} 

Répondre

1

Avec EF 6, premier code préfixera les noms de colonnes avec le nom de la propriété lorsque vous utilisez plusieurs instances de même type complexe, comme

PersonalAddress_Street 
BusinessAddress_Street 
... 

et ainsi de suite. Vous n'avez besoin que des anciennes versions de EF. L'option de mappage vous permet également de remplacer ces noms générés automatiquement par quelque chose de plus agréable.

Aussi, je ne pense pas que ce soit le code de configuration correcte en fonction de vos modèles (peut-être faute de frappe?):

this.Property(t => t.PersonalAddress.Address.Street) 
// should be 
this.Property(t => t.PersonalAddress.Street) 
Questions connexes