Complex type: multiple instances in one model?

你离开我真会死。 提交于 2019-12-23 08:49:51

问题


Is there a way to have multiple instances of complex type inside the same model using Fluent api model builder?

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);
    }
}

回答1:


With EF 6, Code First will prefix the column names with your Property name when you use multiple instances of same complex type, like

PersonalAddress_Street
BusinessAddress_Street
...

and so on. You only need the mappings older versions of EF. The mapping option also allows you to replace these autogenerated names with something nicer.

Also, I don't think this is the correct configuration code based on your models (typo maybe?):

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



回答2:


(Auto-answered part in the question converted to a real answer)

If multiple complex type class instances are used in same CF Model, configuration of these classes is set at CF Model level like this:

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");
    }
}



回答3:


It's possible and simpler to use data annotation [ComplexType] and EF will set the names automatically. Using your example:

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; }
}

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

EF creates all fields in Contact Entity and name it like: PersonalAddress_Street, BusinessAddress_Street, PersonalAddress_City, BusinessAddress_City, etc...



来源:https://stackoverflow.com/questions/18311680/complex-type-multiple-instances-in-one-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!