C# 如何在EF 6.1 CodeFirst中的视图上添加导航属性

C# 如何在EF 6.1 CodeFirst中的视图上添加导航属性,c#,entity-framework,entity-framework-6,navigation-properties,entity-framework-6.1,C#,Entity Framework,Entity Framework 6,Navigation Properties,Entity Framework 6.1,让我们举出一个例子来解释我的问题 MyTable1 +身份证 +myTable2Id MyTable2 +身份证 MyView1 +身份证 +myTable2Id 根据MyTable1中的数据,案例中存在MyView1。现在,我想从我对MyTable2的视图中的EF6.1代码优先方法创建一个导航属性 我知道这可以通过数据库优先的方法实现,但是也可以通过代码优先的方法实现吗 编辑: 我在网上搜索了一些,但由于“视图”这个词有很多含义,所以很难找到有关它的信息 同样,在我尝试过的代码中的方法

让我们举出一个例子来解释我的问题


MyTable1

+身份证

+myTable2Id


MyTable2

+身份证


MyView1

+身份证

+myTable2Id


根据MyTable1中的数据,案例中存在MyView1。现在,我想从我对MyTable2的视图中的EF6.1代码优先方法创建一个导航属性

我知道这可以通过数据库优先的方法实现,但是也可以通过代码优先的方法实现吗

编辑:

我在网上搜索了一些,但由于“视图”这个词有很多含义,所以很难找到有关它的信息

同样,在我尝试过的代码中的方法中,我总是会得到一个错误,即迁移无法完成。因为迁移尝试向视图添加外键,这是不可能的

EDIT2:

再详细解释一下我的解释。我希望能够通过以下方式编写代码:

Guid table2Id = context.MyView1.FirstOrDefault().MyTable2.id;
EDIT3:

我会再补充一点,看看是否能更好地解释我的问题

将以下内容添加到我的视图实体时:

public virtual MyTable2 Table2 { get; set;}
EF将自动生成以下迁移:

public override void Up() {
    CreateIndex("MyView1", "MyTable2Id");
    AddForeignKey("MyView1", "MyTable2Id", "MyTable2", "id")
}
运行更新数据库时出现以下错误:

“无法在视图‘MyView1’上创建索引,因为该视图未绑定架构”

编辑4:

有人评论说移民不是一成不变的。。是我做的

我使用了以下fluentAPI:

    // Map one-to-zero or one relationship 
    modelBuilder.Entity<MyTable2>()
        .HasRequired(t => t.MyTable1)
        .WithOptional(t => t.MyTable2);

    modelBuilder.Entity<MyTable1>()
        .HasOptional(t => t.MyTable2);
//将一个映射到零或一个关系
modelBuilder.Entity()
.HasRequired(t=>t.MyTable1)
.可选(t=>t.MyTable2);
modelBuilder.Entity()
.has可选(t=>t.MyTable2);
并将我的表更改为:(将FK更改为MyTable2并从视图中删除)


MyTable1

+身份证


MyTable2

+身份证 +我的表1


MyView1

+身份证



最后哪个更好,因为这样我的模型中的空值更少。

在EF中,您可以使用数据库视图,将其映射到实体并引用它,就像处理表一样。 对于代码优先的流程,您必须在迁移类的Up和drop方法中创建视图:

public partial class AddView : DbMigration
  {
    public override void Up()
    {
      this.Sql(@"CREATE VIEW MyView1 AS ....");
    }
    public override void Down()
    {
        this.Sql(@"DROP VIEW MyView1....");
    }
  }
编辑:


谢谢你的回答@Elio.Batista,但这是我已经知道的部分。困难的是,当我在代码中创建导航属性时,正如我在最初文章的EDIT3中所显示的那样。EF考虑添加迁移,它需要在视图上生成外键。但据我所知,视图不能有外键?因为它不是一个模式不?也许你真的可以告诉我它是如何工作的,但是你能给你的anwser提供关于如何映射它的信息吗。。看来,这是我错过的部分。好吧,你已经知道最难的部分了。添加迁移后,只需从Up和Down方法中删除这些列的EF生成代码(CreateIndex和AddForeignKey),然后像往常一样运行update database。这些方法需要修改以满足我们的需要,它们不是一成不变的。我按照您所说的做了,并加载了我的视图,在我的Linq to entities查询中包括FKTable。。但是什么也没发生。。导航属性保持为空。在MyView1实体中,是否指向表2的id?。我用注释编辑了答案。这个问题一直在变化。回答起来不清楚,也不太刺激。@GertArnold,如果你问我,这个问题没有改变吗?我只是想改进一下解释。一句话中的问题是:“如何在EF 6.1 CodeFirst中的视图上添加导航属性”。我改进我的问题以获得答案。。并展示我已经试图避免的事情,以及我已经知道的事情。。
public long myTable2Id { get; set; }

[ForeignKey( "myTable2Id" )]
public virtual MyTable2 Table2 {get;set;}