2012-04-09 114 views
2

我想从具有单个实体类的两个表中获取数据。怎么样??如何映射具有多个表的单个实体

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

上面的entity class拥有6个属性,其中3个属性表示一个table1,3个表示table2。 在数据库中的表1保持candidate_id作为主键和表中的两个拥有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"); 
     }); 
    } 
}` 

,并在控制器动作,我用下面的LINQ到实体查询

var data = db.homeViewModel.ToList(); 

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

+0

我推荐mvc教程 – 2012-04-09 06:56:13

+0

也添加标记实体框架4.1。 – 2012-04-09 08:17:39

+1

@AndrewBarber - MVC教程如何讲述实体框架概念?任何MVC教程只会涵盖基本的EF,而不是像这样的高级概念。 – 2012-04-09 08:27:52

回答

1

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

1

如果您建议Table2仅仅保留table1的外键,但具有不同的主键,那么您无法真正地做你正在问的问题。简单地持有foriegn键意味着这是一对多的关系,并且没有办法像这样在一对多关系中映射单个实体(即使数据只包含一条记录,模型关系类型仍然是一对多关系)

如果你的意思是表2具有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查询,我不会进入,因为我rea我不确切地知道你在这里寻找什么。

0

这被称为实体分裂。要使它工作,CandidateID必须是第二个表中的主键和第二个表中的外键(实体分割只能与数据库中的一对一关系一起使用)。

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

+0

但@Ladislav我只有当table2持有外键值时获取数据。但我想让table2数据可选我。e表1的显示数据或者表2中可用的相关数据。 – RollerCosta 2012-04-09 09:37:02

+0

我在答案中加了一些说明。 – 2012-04-09 09:40:04

+0

对@ LadislavMrnka的回答进行了一些修改。你需要申请左连接,然后 – RollerCosta 2012-04-09 10:05:04

相关问题