实体拆分以及如何配置连接

时间:2015-05-05 23:16:00

标签: c# entity-framework entity-framework-6

我有两张桌子。

CREATE TABLE [dbo].[BusinessUnit](
    [BusinessUnitId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [CurrencyId] [int] NOT NULL);

CREATE TABLE [dbo].[Currency](
    [CurrencyId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](35) NOT NULL,
    [Country] [nvarchar](50) NOT NULL,
    [Code] [nvarchar](50) NOT NULL);

我有一个实体

public class BusinessUnit
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CurrencyId { get; set; }
    public string CurrencyCode { get; set; }
}

我想使用Entity Splitting来引入dbo.Currency.Code字段。我的映射不起作用。这是映射。

class BusinessUnitMap : EntityTypeConfiguration<BusinessUnit>
{
    public BusinessUnitMap()
    {
        Property(bu => bu.Id).HasColumnName("BusinessUnitId");       
        ToTable("BusinessUnit");
        Map(map =>
        {
            map.Property(bu => bu.CurrencyId);
            map.Property(bu => bu.CurrencyCode).HasColumnName("Code");
            map.ToTable("Currency");
        });
    }
}

我尝试过其他一些变体。我无法弄清楚如何使映射工作。它不断在BusinessUnitId上生成SQL连接。我需要在CurrencyId上进行连接。

1 个答案:

答案 0 :(得分:1)

对于您的情况,我认为您不能使用实体拆分,因为您有多对一的关系。你可以做这样的事情:

public class BusinessUnit
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Currency Currency { get; set; }
    public string CurrencyCode { get { return Currency.Code; } }
}

public class Currency
{
    public string Code { get; set; }
}

或使用相同的设置,DTO:

public class BusinessUnitDTO
{
    public string Name { get; set; }
    public string CurrencyCode { get; set; }
}

和扩展方法:

public static IQueryable<BusinessUnitDTO> GetBusinessUnitDTO(this IQueryable<BusinessUnit> q)
{
    return q.Select(b => new BusinessUnitDTO
    {
        Name = b.Name,
        CurrencyCode = b.Currency.Code,
    };
}
如果您想要一个具有该组数据的单个对象,那么

或其他效果。