一个实体是否可以从两个表中获取数据?

时间:2014-03-20 21:46:22

标签: c# sql-server entity-framework

是否可以让一个实体从两个表中获取数据?

例如。

Table1包含列:Id, Name, Table2_Id

Table2包含列:Id, FullName

我的实体具有属性:Id, Name, FullName

我期望配置(流利地)实体框架来构建查询:

select t1.Id, t1.Name, t2.FullName
from Table1 t1 join Table2 t2 on t1.Table2_id = t2.Id

是否可以没有两个分开的实体和另一个合并它们的实体?

快速谷歌后,我发现如何将数据从表合并到一个实体。我需要像这样配置实体框架

modelBuilder.Entity<MyEntity>()
.Map( m => {
 m.Properties(x=> new { x.Id, x.Name });
 m.ToTable("Table1");
})
.Map( m => {
 m.Property(x=>x.FullName);
 m.ToTable("Table2");
});

但是如何告诉实体框架加入来自Table2_Id的{​​{1}}和来自Table1的{​​{1}}的表格。

我知道我可以创建视图和地图实体来查看,但如果可能的话我想使用我提供的场景。

2 个答案:

答案 0 :(得分:0)

是的,如果两个表中的ID相同,那么您可以将1:1映射映射到单个实体。

您还可以执行Table Per Concrete Type继承,其中继承的属性放在一个表中,派生属性放在另一个表中。

答案 1 :(得分:0)

是的,但是首先您必须在数据库中创建一个视图。

赞:

>

create view my_view
as
select t1.Id, t1.Name, t2.FullName
from Table1 t1 join Table2 t2 on t1.Table2_id = t2.Id
  1. 您必须在项目中创建模型

像这样:

>

public class my_view_model
{
    public int Id{ get; set; }

    public string Name{ get; set; }

    public string FullName{ get; set; }
}
  1. 在上下文(DbContext)中添加模型

>

public virtual DbSet<my_view_model> my_view_model{ get; set; }   
  1. 在上下文上,在OnModelCreating上,添加以下内容:

>

protected override void OnModelCreating(ModelBuilder modelBuilder)
{           
    modelBuilder
       .Entity<my_view_model>(e =>
        {
             e.HasNoKey();
             e.ToView("my_view");
             e.Property(v => v.Id).HasColumnName("Id");
             e.Property(v => v.Name).HasColumnName("Name");
             e.Property(v => v.FullName).HasColumnName("FullName");
        });
        base.OnModelCreating(modelBuilder);
}