Entity Framework - 重用复杂类型

7

我有一个Code First Entity Framework中的实体,目前看起来是这样的:

public class Entity
{
    // snip ...

    public string OriginalDepartment { get; set; }
    public string OriginalQueue { get; set; }

    public string CurrentDepartment { get; set; }
    public string CurrentQueue { get; set; }
}

我想为这些类型创建一个复杂类型,类似于以下内容:
public class Location
{
    public string Department { get; set; }
    public string Queue { get; set; }
}

我希望对于“现有”和“原始”的字体使用相同的字体类型:
public Location Original { get; set; }
public Location Current { get; set; }

这是否可行,还是我需要创建两个复杂类型CurrentLocationOriginalLocation

public class OriginalLocation
{
    public string Department { get; set; }
    public string Queue { get; set; }
}

public class CurrentLocation
{
     public string Department { get; set; }
     public string Queue { get; set; }
}
1个回答

8

这个功能可以直接支持,您不需要创建两个复杂类型。

您还可以使用模型生成器显式地配置您的复杂类型。

modelBuilder.ComplexType<Location>();

为了自定义列名,您应从父实体配置中进行配置。
public class Location
{
    public string Department { get; set; }
    public string Queue { get; set; }
}

public class MyEntity
{
    public int Id { get; set; }
    public Location Original { get; set; }
    public Location Current { get; set; }
}

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<Location>();

        modelBuilder.Entity<MyEntity>().Property(x => x.Current.Queue).HasColumnName("myCustomColumnName");
    }
}

这将把MyEntity.Current.Queue映射到myCustomName列。

我想我不确定它如何被支持。ComplexTypeConfiguration<T>类有一个Property()方法,要求我指定列名。每个列名都会不同。 - Dismissile
我猜我应该澄清一下,我想能够自定义两种复杂类型的列名称。这是否支持? - Dismissile
你想要它们只是有不同的前缀还是完全定制化? - archil
我更喜欢完全定制化,但如果只有前缀的话也可以接受。 - Dismissile
啊,我可以将列名放在实体配置上,而不是复杂类型上。谢谢! - Dismissile
@archil 那么你的意思是,在不自定义模型生成器的情况下,public Location Original 会映射到 public string OriginalDepartmentpublic string OriginalQueue 吗? - Jacob Stamm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接