如何在EF 6.1 Code First中的视图上添加导航属性

时间:2014-04-10 20:32:53

标签: c# entity-framework entity-framework-6 navigation-properties entity-framework-6.1

让我们来解释一下我的问题。


MYTABLE1

+ ID

+ myTable2Id


MyTable2

+ ID


MyView1

+ ID

+ myTable2Id


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

我知道从数据库第一种方法可以实现,但也可以从代码优先方法中获取,以及如何实现?

修改

我在互联网上搜索一些内容,但由于View这个词有很多含义,很难找到相关信息。

另外,对于我尝试的代码中的方法,我总是会收到无法完成迁移的错误。因为迁移尝试向视图添加外键,这是不可能的。

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")
}

在运行update-database时出现以下错误:

“无法在视图'MyView1'上创建索引,因为视图不是架构绑定”

EDIT4:

在评论的帮助下,迁移不是一成不变的,而且是可变的,我做到了。

我使用了以下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);

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


MYTABLE1

+ ID


MyTable2

+ ID + MYTABLE1


MyView1

+ ID


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

1 个答案:

答案 0 :(得分:4)

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