将复合外键映射到复合主键,其中外键也是主键

2024-02-13

我想将 VM_hostname、datetime 和 name 属性设置为复合键磁盘类。同时VM_hostname和datetime磁盘类应参考 VM_hostname 和 datetime虚拟机类(即外键)。

我这样做了,但它给了我这个例外: 类型“WebJob1.Historical.Disk”上的属性“datetime”上的ForeignKeyAttribute 无效。在依赖类型“WebJob1.Historical.Disk”上找不到导航属性“Datetime”。名称值应该是有效的导航属性名称

有人知道吗?另外,请注意我使用数据注释。

public class VirtualMachine
{

    [Key]
    [Column(Order = 0)]
    public string VM_Hostname { get; set; }
    [Key]
    [Column(Order = 1)]
    public DateTime Datetime;
    public virtual List<Disk> disks { get; set; }
}

 public class Disk
{
    [Key,ForeignKey("VirtualMachine"),Column(Order = 0)]
    public string VM_hostname { get; set; }
    [Key,ForeignKey("Datetime"), Column(Order = 1)]
    public DateTime datetime { get; set; }
    [Key, Column(Order = 2)]
    public string name { get; set; }

    public virtual VirtualMachine VirtualMachine{ get; set; }


}

你的问题和我建议的问题之间的主要区别复制 https://stackoverflow.com/a/5441569/861716是你的ForeignKey属性不引用 -

  • 从原始属性到导航属性
  • 从导航属性到原始属性

在您的情况下,引用是从一个原始属性到另一种类型的另一个原始属性。还有,小细节,VirtualMachine.Datetime应该是财产,而不是成员。但我不得不承认,“重复”并不包括你的情况。

因此,让我们尝试将其变成如何在 Entity Framework 6 中处理这种情况的全面答案。我将使用抽象模型来解释各种选项:

public class Parent
{
    public int Id1 { get; set; } // Key
    public int Id2 { get; set; } // Key   
    public string Name { get; set; }   
    public virtual List<Child> Children { get; set; }
}

public class Child
{
    public int Id1 { get; set; } // Key
    public int Id2 { get; set; } // Key
    public int Id3 { get; set; } // Key
    public string Name { get; set; }
    public virtual Parent Parent { get; set; }
} 

有三个选项可用于设置映射。

Option 1

数据注释,ForeignKey属性:

public class Parent
{
    [Key]
    [Column(Order = 1)]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id2 { get; set; }
    
    public string Name { get; set; }

    public virtual List<Child> Children { get; set; }
}

public class Child
{
    [Key]
    [Column(Order = 0)]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 1)]
    public int Id2 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id3 { get; set; }

    public string Name { get; set; }

    [ForeignKey("Id1,Id2")]
    public virtual Parent Parent { get; set; }
}

如您所见,这里ForeignKey属性是指从导航属性到原始属性。此外,列顺序中的绝对数字并不重要,重要的是它们的顺序。

Option 2

数据注释,InverseProperty属性:

public class Parent
{
    [Key]
    [Column(Order = 1)]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id2 { get; set; }
    
    public string Name { get; set; }

    public virtual List<Child> Children { get; set; }
}

public class Child
{
    [Key]
    [Column(Order = 0)]
    [InverseProperty("Children")]
    public int Id1 { get; set; }
    [Key]
    [Column(Order = 1)]
    [InverseProperty("Children")]
    public int Id2 { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Id3 { get; set; }

    public string Name { get; set; }

    public virtual Parent Parent { get; set; }
}

InverseProperty从关系一端的类型中的一个或多个属性指向关系另一端的类型中的导航属性。实现相同映射的另一种方法是应用[InverseProperty("Parent")]的两个关键属性Parent.

Option 3

流畅的映射:

modelBuilder.Entity<Parent>().HasKey(p => new { p.Id1, p.Id2 });
modelBuilder.Entity<Child>().HasKey(p => new { p.Id1, p.Id2, p.Id3 });
modelBuilder.Entity<Parent>()
    .HasMany(p => p.Children)
    .WithRequired(c => c.Parent)
    .HasForeignKey(c => new { c.Id1, c.Id2 });

正如评论中所说,流畅的映射比数据注释更不容易出错。数据注释提供了太多的选项来配置映射,并且并不总是很容易看出哪些部分是连接的。这就是为什么我最喜欢流畅的映射。

实体框架核心

在 EF-core(当前版本 3.1.6)中,复合主键无法通过数据注释建模。它抛出一个运行时异常:

实体类型“Parent”具有使用数据注释定义的复合主键。要设置复合主键,请使用 Fluent API。

所以对于 EF-core 只有选项 3 是可行的。映射几乎相同:

modelBuilder.Entity<Parent>().HasKey(p => new { p.Id1, p.Id2 });
modelBuilder.Entity<Child>().HasKey(p => new { p.Id1, p.Id2, p.Id3 });
modelBuilder.Entity<Parent>()
    .HasMany(p => p.Children)
    .WithOne(c => c.Parent) // Different here
    .HasForeignKey(c => new { c.Id1, c.Id2 });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将复合外键映射到复合主键,其中外键也是主键 的相关文章

  • 是否可以存根实体框架上下文和类来测试数据访问层?

    我熟悉用于测试 ASP NET MVC 应用程序中的控制器和业务逻辑的技术 我们的应用程序中的数据访问集中在松散耦合的特殊服务中 使用接口并通过实体框架与实际数据库一起使用 然而 随着 DAL 变得越来越复杂 隐藏数据库实现细节并为应用程序
  • 无论 DataAnnotations 属性如何,ModelState.IsValid 始终为 true

    我在 Visual Studio 2015 中使用新的 MVC6 框架 突然我所有的数据注释都停止工作 所有这些 无需我更改代码 public sealed class RegisterUser Required ErrorMessage
  • 实体框架 - 查询可为空列时出现问题

    我在从具有可为空的tinyint 列的表中查询数据时遇到问题 问题似乎是查询生成为 AND CAST Extent1 PositionEffect AS int p linq 3 gt p linq 3 NULL 如果我手动运行该查询 它不
  • Web API 的 ASP.NET MVC Core 控制器 PATCH 方法

    给定一个数据库表 Person 包含 3 列 Id 名字和姓氏 使用真实的 DbContext 时 ASP NET Core Web API MVC 控制器方法 PATCH 仅修改姓氏 看起来如何 我根本不知道如何实现它 并且找不到相关教程
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 如何使用 LINQ to Entities 调用带返回值的 Oracle 函数?

    我正在开发一个从 Oracle 11g 数据库访问数据的应用程序 我使用的是 EF4 并且使用 LINQ 访问数据 我遇到过一个场景 我需要调用存储在包中的函数 这个函数也有一个返回值 我已将此函数添加到实体数据模型中 但无法对其执行 添加
  • Entity Framework Core 中的两个外键

    我在使用 Entity Framework Core 创建数据库时使用代码优先方法 我想创建两个指向同一个表的外键 我的示例显示用户表将保存用户 ID 消息表将保存接收者 ID 和发送者 ID 这意味着两个值必须指向同一个表 用户代码 pu
  • 选择里面的 Include in EF Core

    我有一个如下所示的实体 为简洁起见 部分删除 它包括许多其他属性 public class Tender Key DatabaseGenerated DatabaseGeneratedOption Identity public int I
  • OWIN 可以替代 ASP.NET MVC 应用程序中的 DI 吗?

    大约一年前 在 Visual Studio 中创建时自动生成的 MVC 项目不包含任何有关 OWIN 的内容 作为再次申请并试图了解这些变化的人 我想知道 OWIN 是否可以替代我的 DI 据我了解 Startup Auth cs 中的以下
  • 为什么 EF 5.0 在编译为 sql 时不支持此 EF 4.x LINQ 语法?

    我有一些代码最近从 EF 4 2 升级到 EF 5 0 实际上是 EF 4 4 因为我在 Net 4 0 上运行 我发现我必须更改查询的语法 我很好奇为什么 让我从问题开始 我有一个由客户端定期填充的事件日志表 对于每个事件日志 都会在报告
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 简单的 Linq 查询对同一个表有重复的连接?

    来自 Julia Lerman 的新实体框架书中的示例 我有一个包含两个表的数据库 联系人和地址 Contact 表有一个 ContactID int 以及名字 姓氏等 Address 表有一个 ContactID 以及城市 州 邮政编码等
  • 限制实体框架中子实体的数量

    底线在前 有没有一种简洁的方法可以限制可以属于实体框架中父级的子实体的数量 我现在使用的是4 3 1 问题 我正在开发一个 ASP NET MVC3 站点 它通过使用实体框架的数据访问层访问数据 我有一个 SearchList 实体 它与搜
  • 如何在没有互联网连接的情况下安装 NuGet 包?

    目前我正在一台不允许访问互联网的虚拟电脑上进行开发 我设法获取 NuGet Tools vsix 将 NuGet 添加到 Visual Studio 2010 但似乎无法找出如何离线部署 NuGet 包 例如 我下载了EntityFrame
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • 使用实体框架从 2 个表返回数据

    我正在使用 MVC3 和实体框架 但我需要来自不同表的更多数据 通常我会做这样的事情来从表中获取数据 Table Users id username 在代码中我会做这样的事情来获取所有用户 public static IEnumerable
  • 防止更新 ASP.NET MVC 和实体框架中未更改的值

    我正在使用 ASP NET MVC 和实体框架 我有一个 编辑人员 网页 可以在其中编辑人员的字段 然后在回发操作中 我使用以下代码 var person objectCtx Persons Where s gt s Id id First
  • PL/SQL 过程:如何返回 select 语句?

    我想创建一个存储过程 on ORACLE数据库服务器我的问题是 我不知道如何返回 select 语句 这是程序中应包含的逻辑 输入参数 过滤器1 int 过滤器2 字符串 with cte as select val1 val2 stdde
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重

随机推荐

  • 如何在 ClearCase 中创建某些项目或流的快照视图?

    我想获取可以在clearcase项目资源管理器中找到的某些流或项目的内容 2 1 cleartool descr l project myProject myPVob 通过一些 grep 您可以获得组件 可写或不可写 和策略的列表 如果您只
  • 在 C/C++ 中打印前导空格和零

    我需要在数字前打印一些前导空格和零 以便输出如下所示 00015 22 00111 8 126 在这里 我需要打印leading spaces当数字是even and leading zero when odd 我是这样做的 int i d
  • 应用程序脚本我的执行条目延迟/丢失

    最近 我的执行遇到了添加执行条目延迟的问题 Google Sheet 上的应用程序脚本将成功运行 基于输出 但执行日志中没有条目或条目延迟 10 分钟以上 更令人担忧的是 今天我收到一封自动生成的电子邮件 其中包含脚本错误 很抱歉 服务器发
  • 按主页按钮并从应用程序图标调用 onCreate 再次访问应用程序?

    我有一个离线在线应用程序 我发现其中有一个奇怪的问题 可能不是 但我不明白 应用程序的要求是 如果互联网可用 即使从启动应用程序或恢复 我也会调用网络服务并将数据存储在 sqlite 中 否则应用程序将保持离线模式 我有 2 个活动 第二个
  • 如何在 Excel 中通过 OleDB 使用命名范围?

    我正在尝试使用 ASP NET C 从 Excel 中的特定命名范围中提取数据 这是我试图提取的示例 我想要的是使用名称 RANGE NAMED 的 B C D 可以用 OleDB 做到这一点吗 此致 Alex 你可以试试这个代码 usin
  • Galaxy Nexus:采样更多传感器时,传感器采样率会变得更快

    我正在尝试从 Samsung Galaxy Nexus 带 Android 4 0 尽快读取传感器值 为此 我使用不同的传感器和采样率做了一些实验 并发现了一个非常奇怪的行为 当我只使用 Acc Sensor 时 采样率约为 50Hz 但是
  • Haskell 中的短路 (&&)

    最近一直困扰我的一个快速问题 Haskell 是否在返回布尔值的函数中执行所有等价测试 即使返回一个假值 例如 f a b a b 2 a b 2 如果第一个测试返回 false 是否会执行第二个测试 或者 Haskell 是否足够懒 不做
  • 如何更改数据表中日期列的日期格式?

    我正在从数据库填充数据表 它包含两个字段 DATE TIME 两个字段都是datetime column 我想遍历数据表并更改日期格式DATE列即dd MM yyyy int i 0 string d foreach DataRow dr
  • 使用 mpatches.Patch 自定义图例

    我使用以下代码创建自定义 matplotlib 图例 import matplotlib patches as mpatches import matplotlib pyplot as plt colors g w texts Green
  • 对非 PHP 文件使用 Laravel @include 指令?

    我一直在寻找一种使用带有非 PHP 文件扩展名的 Laravels Blade 模板引擎 而不是file name blade php能够使用file name blade js or file name blade css 无济于事 我找
  • 1and1 域名、Heroku 托管 - 如何设置电子邮件?

    我刚刚从 1and1 购买了一个域名 并将 cname 设置为指向我在 heroku 上的应用程序 不过 我想要一个电子邮件 电子邮件受保护 cdn cgi l email protection 我需要通过 1and1 或 heroku 执
  • OCR 处理前的图像预处理

    我当前的项目涉及将 pdf 中的文本转录为文本文件 我首先尝试将图像文件直接放入 OCR 程序 tesseract 中 但效果不佳 原始图像文件基本上是旧报纸 并且有一些背景噪音 我确信 tesseract 存在问题 因此 我尝试在将图像输
  • Python 为什么是 10e26 != 10**26 ? (浮点不准确?)

    我试图在 python 中处理一些相当大的数字并遇到溢出错误 我决定进一步调查 发现了一个我无法解释的不平等现象 当我评估 10 26 时 我得到 gt gt gt 10 26 100000000000000000000000000 这是完
  • iOS:应用程序后台运行时隐藏屏幕上的敏感信息

    当前台应用程序进入后台时 例如按下主页按钮 如何更改最顶层视图控制器上的元素prioriOS 何时拍摄快照并开始动画以显示下一个屏幕 我问这个问题是因为我正在编写一个需要符合 HIPAA 要求的应用程序 并且我担心操作系统为执行此动画而拍摄
  • 通过淘汰赛在我的下拉列表中预选一个项目

    我有以下下拉菜单 div Dummy div
  • 将附件添加到 .NET 电子邮件

    如何附加名称非常不友好的文件 例如其中包含会话 ID 号的文件 但将其附加为其他名称 有问题的文件名中包含会话 ID 以避免 Web 服务器上的名称冲突 但当我将其附加到文件时 最好使用更友好的名称 有没有办法将不友好的名称附加为另一个名称
  • 您可以使用 Canvas 截取页面的“屏幕截图”吗?

    我有一个页面 我们使用 CSS 定位一堆元素 并使用 JS 更改它们的 顶部和左侧 位置 我收到的报告称这些事情已经错位 但用户有动机对此撒谎以 作弊 所以我不确定他们是否说的是实话 我试图找到一种方法来弄清楚他们是否在撒谎 并找到一些 证
  • 我可以信任 PHP __destruct() 方法被调用吗?

    在 PHP5 中 是否保证为每个对象实例调用 destruct 方法 程序中的异常可以防止这种情况发生吗 还值得一提的是 如果子类有自己的析构函数 则父类析构函数是not自动调用 你必须明确地调用父级 destruct 来自子类 destr
  • Numpy 数组与其他数组索引会产生广播错误

    我有两个索引数组 elim range 130 240 tlim range 0 610 要索引的数组 I 最初的形状为 299 3800 当我尝试按如下方式对其进行索引时 I elim tlim 我收到以下错误消息 形状不匹配 索引数组无
  • 将复合外键映射到复合主键,其中外键也是主键

    我想将 VM hostname datetime 和 name 属性设置为复合键磁盘类 同时VM hostname和datetime磁盘类应参考 VM hostname 和 datetime虚拟机类 即外键 我这样做了 但它给了我这个例外