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

2023-11-26

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


MyTable1

+id

+myTable2Id


MyTable2

+id


MyView1

+id

+myTable2Id


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

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

EDIT:

我在互联网上搜索了一些,但由于“视图”一词的含义很多,因此很难找到有关它的信息。

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

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

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


MyTable1

+id


MyTable2

+id +我的表1


MyView1

+id


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


在 EF 中,您可以使用数据库视图并将其映射到实体并引用它,就像使用表一样。 对于代码优先过程,您必须在 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....");
    }
  }

EDIT:

public long myTable2Id { get; set; }

[ForeignKey( "myTable2Id" )]
public virtual MyTable2 Table2 {get;set;}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 EF 6.1 CodeFirst 中的视图上添加导航属性 的相关文章

随机推荐

  • 从嵌套字典中的项目构造 pandas DataFrame

    假设我有一个嵌套字典 user dict 其结构 Level 1 用户 ID 长整型 Level 2 类别 字符串 Level 3 各种属性 浮点数 整数等 例如 该字典的条目为 user dict 12 Category 1 att 1
  • Java 64位JDK问题

    如果我使用 64 位 JDK 编译一些 java 文件 然后从中创建一个 JAR 文件 生成的 JAR 能否正确地与 32 位 JRE 一起工作 还是我必须使用 32 位 JDK Thanks 生成的 JAR 将正确地与 32 位 JRE
  • preg_match():找不到结束分隔符“^”[重复]

    这个问题在这里已经有答案了 警告 preg match 在第 29 行 functions validations php 中找不到结束分隔符 代码 if preg match mail pat email components 我要编辑什
  • LinqPad - 将 SQL 转换为 Linq 命令

    我最近购买了 LINQPad 希望它能让我将 SQL 语句转换为 LINQ 语句 使用 LINQPad 我可以附加数据库并运行返回我需要的结果的 SQL 语句 但我找不到将该 SQL 语句转换为 LINQ 的 命令 您能否让我知道如何使用
  • 如何在 QT Creator 中推广自定义小部件

    在 qt 5 2 1 中 我创建了一些自定义小部件 例如按钮 传统上有两种方法可以做到这一点 您可以推广现有的小部件 并更改 添加功能 或者从头开始创建自定义小部件 我用过后者 然而 在某些情况下 我想使用我的自定义小部件 但通过升级来更改
  • 为什么 svg 引用带有剪辑路径的元素不起作用?

    实现 SVG 精灵时
  • SQL Server,将命名实例转换为默认实例?

    我需要将 SQL Server 2005 的命名实例转换为默认实例 有没有办法在不重新安装的情况下做到这一点 问题是 六分之二的开发人员安装了命名实例 因此 对于我们其他 4 个人来说 它变成了一个痛苦的改变连接字符串 我正在寻找阻力最小的
  • 正则表达式删除开头的数字和 -

    我正在处理字符串列表 但我想更改字符串 以便它们对用户来说看起来不难看 一个示例列表是 2736162 Magazines 23 2311 Numbers 1 38122 Faces 5 231123 Newspapers 31 31235
  • Javascript和JQuery,如何验证select中是否存在选项元素?

    使用 JQuery 我尝试根据查询字符串在 select 元素中设置一个选项 这个问题类似于this 但是我仍然需要知道如何在执行选择之前检查元素是否存在 否则页面将不断刷新自身 请参阅下面的退出条件 获取查询字符串是使用函数 getPar
  • 当对象的属性被设置时调用函数

    我真的不知道如何解释这一点 但我会向您展示代码并告诉您我想要实现的目标 假设我制作了一个快速对象 var test 然后我为其设置一个属性 我insist在语法上 它不能使用任何函数作为设置器 test hello world 很简单 嗯
  • 数组下标的类型为“char”[-Wchar-subscripts]

    我正在尝试在辅助函数下面的帮助下删除前导 尾随空白字符 编译时我收到警告 数组下标的类型为 char Wchar subscripts 如何摆脱这个消息 char removeSpace char str char end Trim lea
  • jax-ws ri 2.2.1 没有为 amazon ecs wsdl 文件生成枚举

    我正在尝试为以下亚马逊 wsdl 生成工件 http webservices amazon com AWSECommerceService AWSECommerceService wsdl 使用以下 ant 任务
  • 当进程之间进行通信时,队列相对于管道有什么优势?

    使用 2 有什么优点 如果有的话 Queues over a Pipe进程之间进行通信 我打算使用multiprocessing蟒蛇模块 最大的胜利是队列是进程和线程安全的 管道则不然 如果两个不同的进程尝试从管道的同一端读取或写入 就会发
  • Angular2 - APP_BASE_HREF 与 HashLocationStrategy

    我有一个角度应用程序使用带有 HashLocationStrategy 的路由 我需要在主 html 文件中设置不同的值并在路由中设置不同的值 我尝试了这个解决方案 NgModule imports BrowserModule FormsM
  • 如何在 PHP 中将文件的内容分配给变量

    我有一个包含 HTML 标记的文档文件 我想将整个文件的内容分配给 PHP 变量 我有这行代码 body include email template php 当我做一个var dump I get string 1 是否可以将文件的内容分
  • 为什么 Codan 找不到 size_t

    我刚刚开始使用 Eclipse Indigo 来自 Galileo 每次使用 size t 时 我都会在排水沟中发现红色的小虫子 代码编译没有问题 但我怀疑我必须显式添加包含目录的路径 我已经在那里找到了通常的嫌疑人 我正在使用 Gnu 工
  • MySQL/PHP 错误:[2002] 通常只允许每个套接字地址(协议/网络地址/端口)使用一次

    我已经在 stackoverflow 上找不到这个问题的解决方案 大多数其他相关主题都与 Apache 未首先启动并出现此错误有关 我的问题是 在 apache 运行后 连接到我们的 php mysql 网站的一些用户将收到此错误 PHP
  • date.setHours() 不起作用

    我正在尝试使用 javascript 从给定的日期时间字符串中减去小时 我的代码是这样的 var cbTime new Date cbTime selectedTime setHours 5 5 Where selectedTime是给定的
  • 是否可以查询到不符合指定条件的数据?

    我正在为我的列表视图 android 获取用户列表 我使用 firebaselistadapter 来备份我的列表视图 我想显示除我的之外的用户数据 就像一个sql查询从用户表中选择一些东西 其中id userid 我想获取所有其他用户的数
  • 如何在 EF 6.1 CodeFirst 中的视图上添加导航属性

    让我们举一个例子来解释我的问题 MyTable1 id myTable2Id MyTable2 id MyView1 id myTable2Id 案例中存在MyView1 来自MyTable1的数据 现在我想从视图中的 EF6 1 代码优先