实体框架6 - 从另一个表填充属性

时间:2018-04-20 07:23:58

标签: c# entity-framework-6

我有一个包含现有数据库,模型和所有内容的工作项目。 我正在考虑使用EF6,但与此同时我想保留控制权。 而我的问题是,我无法解决以下问题。 我有这两个模型:

public class CMaster
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int DetailId { get; set; }
    public string DetailName { get; set; }
}
public class CDetail
{
    public int Id { get; set; }
    public string Title { get; set; }
}

到目前为止,我有一个查询,如下:

SELECT 
    m.ID,
    m.TITLE,
    m.IDDETAIL DetailId,
    (SELECT d.TITLE FROM DETAIL d 
WHERE d.ID = m.IDDETAIL) DetailName
FROM MASTER m

使用此查询我运行了一个数据库来查询 Master ,并且只查询 Detail 表中的一条记录,该记录属于此 Master < / em>的

我使用的是Fluent API,我设置了类似的内容:

public class CMasterDetailsContext : DbContext
{
    public CMasterDetailsContext(DbConnection existingConnection) : base(existingConnection, contextOwnsConnection: false)
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MYSCHEMA");

        modelBuilder.Entity<CMaster>().ToTable("MASTER");
        modelBuilder.Entity<CMaster>().HasKey(m => m.Id);
        modelBuilder.Entity<CMaster>().Property(m => m.Id).HasColumnName("ID");
        modelBuilder.Entity<CMaster>().Property(m => m.Title).HasColumnName("TITLE");
        modelBuilder.Entity<CMaster>().Property(m => m.DetailId).HasColumnName("IDDETAIL");
        modelBuilder.Entity<CMaster>().Ignore(m => m.DetailName);


        modelBuilder.Entity<CDetail>().ToTable("DETAIL");
        modelBuilder.Entity<CDetail>().HasKey(d => d.Id);
        modelBuilder.Entity<CDetail>().Property(d => d.Id).HasColumnName("ID");
        modelBuilder.Entity<CDetail>().Property(d => d.Title).HasColumnName("TITLE");

        base.OnModelCreating(modelBuilder);
    }

    public DbSet<CMaster> MasterEntries { get; set; }
    public DbSet<CDetail> DetailEntries { get; set; }
}

我以为我应该能够将 Detail 表的一个属性(Title)映射到 Master 表的一个属性(DetailName) OnModelCreating 方法。 我找到了HasComputedColumnSql,但它只存在于EF Core中。

然后我尝试了它:

var oMasterEntriesFromLinqJoin = Enumerable.Join(oContext.MasterEntries, oContext.DetailEntries, m => m.DetailId, d => d.Id, (master, detail) =>
{
    master.DetailName = detail.Title;
    return master;
});

但在这种情况下,EF会加载整个 Details 表,然后进行连接。这意味着两个数据库运行,并且在第一个数据库中将加载整个 Details 表,这是我想要避免的。 有没有(优雅的)解决方案?

0 个答案:

没有答案