如何使用多个表映射单个实体

时间:2012-04-09 08:22:05

标签: c# .net entity-framework-4 mapping ef-code-first

我想从两个具有单个Entity类的表中获取数据。如何??

public class HomeViewModel  
{ 
    [Key] 
    [Column("candidate_ID")] 
    public int candidateID { get; set; } 
    [Column("first_name")] 
    public string firstName { get; set; } 
    [Column("last_name")] 
    public string lastName { get; set; } 

    public string emailID { get; set; } 
    public string mb_country_code { get; set; } 
    public int mobile_no { get; set; } 
}

上面的实体类包含6个属性,其中3个属性表示一个table1,3个表示table2。 在数据库表1中,candidate_id作为主键,表2将candidate_id作为外键

更新:我所做的是添加了DBContext类

public class EmployeeMonitoring : DbContext
{
    public DbSet<HomeViewModel> homeViewModel { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<HomeViewModel>().Map(m =>
            {
                m.Properties(a => new { a.candidateID, a.firstName, a.lastName,a.status });
                m.ToTable("table1");
            }).Map(m =>
            {
                m.Properties(c => new { c.candidateID,c.emailID, c.mobile_no, c.mb_country_code });
                m.ToTable("table2");
        });
     }
}`

并且在Controller Action我使用了Linq to Entity Query

var data = db.homeViewModel.ToList();

但它什么也没有返回,即0计数。

3 个答案:

答案 0 :(得分:1)

如果你建议Table2只持有table1的外键,但是有一个不同的主键,那么你就无法真正做到你所要求的。简单地持一个foriegn键意味着这是一对多的关系,并且没有办法将一个实体映射到一对多的关系(即使你的数据只包含一个记录,模型关系类型仍然是一对多)

如果您的意思是Table2具有candidate_id的主键和外键(因此它是1对1的映射),那么您可以使用此处描述的继承,相当容易地将它们映射到单个实体中:

http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt.aspx

如果你想要的只是创建一个包含来自两个表的数据的单个对象,那么这是一个相对简单的linq查询,我不会进入,因为我真的不知道你在这里想要什么

答案 1 :(得分:1)

首先检查daatbase表中的数据。
这是因为你可能没有table2中的相关数据。即table1主键值(即candidate_id)不存在于table2外键candidateID ...

答案 2 :(得分:0)

这称为实体拆分。要使其工作,CandidateID必须是第二个表中的主键和第二个表中的外键(实体拆分仅适用于数据库中的一对一关系)。

编辑:还有另一个限制。实体拆分不允许可选关系。两个表中的记录必须存在才能使其正常工作,因此如果table2记录是可选的,则必须单独映射两个表,并从加载的记录中构建应用程序中的视图模型。