如何在EF 6.1 CodeFirst中为视图添加导航属性

本文关键字:视图 添加 导航 属性 CodeFirst EF | 更新日期: 2023-09-27 17:57:45

让我们用一个案例来解释我的问题。


MyTable1

+id

+myTable2Id


MyTable2

+id


MyView1

+id

+myTable2Id


案例中存在MyView1,来自MyTable1的数据。现在,我想在View to MyTable2中使用EF6.1 Code first方法创建一个Navigation属性。

我知道数据库优先的方法是可能的,但代码优先的方法也可能吗?

编辑:

我在网上搜索了一些,但由于View这个词的含义很多,很难在上面找到信息

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

第2版:

详细阐述一下我的解释。我希望能够以以下方式在代码中处理它:

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

第3版:

我会再详细解释一下,看看是否能更好地解释我的问题。

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

public virtual MyTable2 Table2 { get; set;}

EF将自动生成以下迁移:

public override void Up() {
    CreateIndex("MyView1", "MyTable2Id");
    AddForeignKey("MyView1", "MyTable2Id", "MyTable2", "id")
}

哪个在运行更新数据库时出现以下错误:

"无法对视图'MyView1'创建索引,因为该视图未绑定到架构"

第4版:

有人评论说,移民不是石头做的。。并且是可变的,我做到了。

我使用了以下流体API:

    // 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);

将我的表更改为:(将FK更改为MyTable2并从视图中删除)


MyTable1

+id


MyTable2

+id+myTable1


MyView1

+id


这最终是更好的,因为这样我的模型中的Null值就更少了。

如何在EF 6.1 CodeFirst中为视图添加导航属性

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

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

编辑:

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