7

有没有办法使用 Fluent api 模型构建器在同一个模型中拥有多个复杂类型的实例?

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

3 回答 3

1

使用 EF 6,当您使用相同复杂类型的多个实例时,Code First 将在列名称前加上您的属性名称,例如

PersonalAddress_Street
BusinessAddress_Street
...

等等。您只需要映射旧版本的 EF。映射选项还允许您用更好的名称替换这些自动生成的名称。

另外,我认为这不是基于您的模型的正确配置代码(可能是错字?):

this.Property(t => t.PersonalAddress.Address.Street)
// should be
this.Property(t => t.PersonalAddress.Street)
于 2014-09-10T19:22:15.453 回答
1

使用数据注释 [ComplexType] 是可能且更简单的,EF 将自动设置名称。使用您的示例:

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 在联系人实体中创建所有字段并将其命名为:PersonalAddress_Street、BusinessAddress_Street、PersonalAddress_City、BusinessAddress_City 等...

于 2018-08-09T15:43:09.380 回答
1

(问题中的自动回答部分转换为真实答案)

如果在同一个 CF 模型中使用多个复杂类型类实例,则这些类的配置在 CF 模型级别设置,如下所示:

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");
    }
}
于 2018-08-09T18:22:35.307 回答