如何将单个实体映射到多个表格?

3
我希望你能用单个实体类从两个表中获取数据。怎么做呢?
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。 在数据库中,table1拥有candidate_id作为主键,而table2则将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到Entity查询:

var data = db.homeViewModel.ToList();

但它没有返回任何结果,即数量为0。


同时添加实体框架4.1标签。 - Brendan Vogt
1
@AndrewBarber - MVC教程如何准确地教授Entity Framework的概念?任何MVC教程都只会涵盖基本的EF,而不是像这样的高级概念。 - Erik Funkenbusch
1
@MystereMan 他的问题原始版本中有一个普通的控制器动作方法,其中调用了空的View()方法,并附有一条注释:“我怎样才能在这里获取数据?” - Andrew Barber
不要用两种不同的方式问同一个问题。 - Erik Funkenbusch
你应该避免这种情况。为了更清晰的解决方案,每个模型应该映射到一个表格。然后创建一个视图模型来结合这两个模型。 - c0deNinja
@cOdeNinja 你说得对,但现在请为我在给定的上下文中提出可能的方法。 - RollerCosta
3个回答

1
如果你的意思是Table2仅仅持有一个指向table1的外键,但是有一个不同的主键,那么你无法实现你所要求的功能。仅仅持有一个外键意味着这是一个一对多的关系,没有办法将单个实体映射到这样的一对多关系中(即使你的数据只包含一条记录,模型关系类型仍然是一对多)。
如果你的意思是Table2有一个候选人ID的主键和外键(因此是一对一的映射),那么你可以使用继承在一个实体中将它们映射成一个。在这里描述了如何简单地实现这种映射。

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
先在数据库表中检查数据。
这是因为您可能在table2中没有相关数据。即 table1 的主键值(即 candidate_id)在 table2 的外键 candidateID 中不存在...

0

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

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


但是 @Ladislav,只有当table2拥有外键值时,我才能获取数据。但我想使table2的数据可选,即在table2中没有相关数据时也显示table1的数据。 - RollerCosta
我在答案中添加了一些说明。 - Ladislav Mrnka
对@LadislavMrnka答案进行一些修改。您需要应用左连接(left join)。 - RollerCosta
@Kannas:关键是当您将单个实体映射到多个表时,您无法控制生成的SQL,并且无法强制EF使用左连接。它总是使用内连接。 - Ladislav Mrnka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接