Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将单个实体映射到多个表_C#_.net_Entity Framework 4_Mapping_Ef Code First - Fatal编程技术网

C# 如何将单个实体映射到多个表

C# 如何将单个实体映射到多个表,c#,.net,entity-framework-4,mapping,ef-code-first,C#,.net,Entity Framework 4,Mapping,Ef Code First,我想用一个实体类从两个表中获取数据。怎么做 public class HomeViewModel { [Key] [Column("candidate_ID")] public int candidateID { get; set; } [Column("first_name")] public string firstName { get; set; } [Column("last_name")] public stri

我想用一个实体类从两个表中获取数据。怎么做

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个属性表示一个表1,3表示表2。 在数据库中,表1将候选_id作为主键,表2将候选_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");
        });
     }
}`

但它不返回任何内容,即0 count。

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

如果您的意思是表2有一个主键和外键的候选者_id(因此它是一个1对1的映射),那么您可以使用下面描述的继承性相当容易地将它们映射到单个实体中:


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

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


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

首先检查daatbase表中的数据。

这是因为表2中可能没有相关数据。i、 e表1主键值(即候选id)不在表2外键候选id中…

也添加标记实体框架4.1。@AndrewBarber-MVC教程将如何准确地教授实体框架概念?任何MVC教程都只介绍基本的EF,而不是像这样的高级概念。@MystereMan他的问题的原始版本有一个简单的控制器操作方法,其中有一个对View()的空调用,并有一条注释:“我如何在这里获取数据?”不要用两种不同的方式问同一个问题两次。你应该避免这种情况。对于更干净的解决方案,每个模型应映射到一个表。然后创建一个结合这两个模型的视图模型。但是@Ladislav我只在表2包含外键值时才获取数据。但我想让表2数据成为可选的,即显示表1的数据,或者相关数据在表2中可用,或者不可用。我对答案进行了一些澄清。对@LadislavMrnka的答案进行了一些修改。您需要应用左联接then@Kannas:要点是,当您将单个实体映射到多个表时,您无法控制生成的SQL,并且无法强制EF使用左联接。它将始终使用内部联接。
var data = db.homeViewModel.ToList();