【问题标题】:How can you add a navigation property on a view in EF 6.1 CodeFirst如何在 EF 6.1 CodeFirst 中的视图上添加导航属性
【发布时间】:2014-04-10 20:32:53
【问题描述】:

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


MyTable1

+id

+myTable2Id


MyTable2

+id


我的视图1

+id

+myTable2Id


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

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

编辑:

我在网上搜索了一些,但由于 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' 上创建索引,因为该视图未绑定架构”

编辑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);

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


MyTable1

+id


MyTable2

+id +myTable1


我的视图1

+id


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

【问题讨论】:

  • 这个问题一直在变化。不太清楚,也不太刺激回答。
  • @GertArnold,如果你问我,问题没有改变?我只是试图改进解释。一句话中的问题:“如何在 EF 6.1 CodeFirst 中的视图上添加导航属性”。我改进了我的问题以获得答案.. 并展示我已经试图避免告诉我已经知道的事情的答案..

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


【解决方案1】:

在 EF 中,您可以使用数据库视图并将其映射到实体并引用它,就像处理表一样。 对于代码优先过程,您必须在 Up 中创建 View 并将其放入迁移类的 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;}

【讨论】:

  • 感谢您的回答@Elio.Batista,但这是我已经知道的部分。困难的是,当我在代码中创建导航属性时,正如我在原始帖子的 EDIT3 中所示。 EF 在添加迁移时认为它需要在视图上创建外键。但据我所知,视图不能有外键?因为它不是架构吗?
  • 也许您确实可以告诉我它是如何工作的,但是您能否详细说明您的 anwser 并提供有关如何映射它的信息。看来这就是我所缺少的部分。
  • 好吧,你已经知道困难的部分了。添加迁移后,只需从 Up 和 Down 方法中删除这些列的 EF 生成代码(CreateIndex 和 AddForeignKey),然后照常运行 update-database。这些方法可以修改以满足我们的需求,它们不是一成不变的。
  • 我按照你说的做了并加载了我的视图,将 FKTable 包含在我的 Linq 到实体查询中。但没有任何反应。导航属性保持为空。
  • 在您的 MyView1 实体中,您是否指向 table2 的 id?我已经使用注释编辑了答案。
猜你喜欢
  • 2014-01-12
  • 2023-03-21
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多