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

Entity Splitting and How to Configure the Join

我有两个表。

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

我已经尝试了其他一些变体。我不知道如何让映射工作。它不断生成 SQL 加入 BusinessUnitId。我需要在 CurrencyId 上进行连接。

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

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

如果你想要一个包含该组数据的对象,或者类似的东西。