实体框架复杂类型在一个模型中的多个实例? [英] Entity framework complex type multiple instances in one model?

查看:144
本文介绍了实体框架复杂类型在一个模型中的多个实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法让复杂的类型相同的模型内部的多个实例使用流利的API模型构建工具?

 公共类联系
{
     公众诠释编号{获得;组; }
     公共字符串名字{获得;组; }
     公共字符串名字{获得;组; }

     公共广播PersonalAddress {获得;组; }
     公共广播BusinessAddress {获得;组; }
}

公共类地址
{
     公共字符串街{获得;组; }
     公共字符串市{获得;组; }
     公共字符串邮政code {获得;组; }
}


保护覆盖无效OnModelCreating(DbModelBuilder模型构建器)
{
     base.OnModelCreating(模型构建器);

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

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

 公共类AddressConfiguration:ComplexTypeConfiguration<地址>
{
    公共AddressConfiguration()
    {

        //道具
        this.Property(T => t.Street)
            .IsOptional()
            .HasColumnName(AddressStreet)
            .HasMaxLength(1024);

        this.Property(T => t.Postal code)
            .IsOptional()
            .HasColumnName(AddressPostal code)
            .HasMaxLength(64);

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

修改(找到了解决办法)

如果多个复杂类型的类的实例在同一CF模型中使用,这些类的配置设置在CF模型级是这样的:

 公共类ContactConfiguration:EntityTypeConfiguration<联系与GT;
{
    公共ContactConfiguration()
    {

        //道具解决复杂类型的类PersonalAddress实例
        this.Property(T => t.PersonalAddress.Address.Street)
            .HasColumnName(PersonalAddressStreet);

        this.Property(T => t.PersonalAddress.Address.Postal code)
            .HasColumnName(PersonalAddressPostal code);

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


        //道具解决复杂类型的类BusinessAddress实例
        this.Property(T => t.BusinessAddress.Address.Street)
            .HasColumnName(BusinessAddressStreet);

        this.Property(T => t.BusinessAddress.Address.Postal code)
            .HasColumnName(BusinessAddressPostal code);

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

解决方案

通过EF 6,$ C C首先$当您使用相同的复杂类型的多个实例,如<将preFIX列名与您的属性名/ P>

  PersonalAddress_Street
BusinessAddress_Street
...
 

等。你只需要映射旧版本的EF。映射选项还可以让你的东西更好替换这些自动生成的名字。

另外,我不认为这是正确的配置code根据您的模型(错字也许?):

  this.Property(T =&GT; t.PersonalAddress.Address.Street)
// 应该
this.Property(T =&GT; t.PersonalAddress.Street)
 

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

EDIT (FOUND THE SOLUTION)

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

解决方案

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)

这篇关于实体框架复杂类型在一个模型中的多个实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆