实体框架:唯一(非主键)父字段上的复合外键

2024-04-24

我有一个表需要通过其绑定到另一个表Id列,并按其第三个表(Id, Code)列。我可以轻松地做SQL服务器同时使用主键和唯一索引,但不知道如何实现它实体框架.

如果我把[Key]两列上的属性,那么我无法创建第一个关系。

否则,如果我只申请一个[Key]那么我就无法建立第二段关系。

有什么解决方法吗?


好的,我可以使用以下方法制作所需数量的钥匙流畅的API。现在可以了。

更详细:
从商业角度来说,我有一个Form具有字段的对象,就像 html 文档中的类型一样input, choice, text, radiogroup etc.
我更喜欢将强类型的字段数据存储在单独的表中,但表单需要知道哪些字段位于其中以维持其唯一顺序。

所以在数据库中我有表:

Form- 包含表单的名称和描述
FormField-(每个表格 0 到多行)包含FormId, 字段类型 and OrderNo。通过设置(表单 ID、订单号)为了独特,我保持正确的顺序。

诀窍在于类型化字段本身存储在不同的表中,例如InputField, ChoiceField, NumberField我希望它们与父 FormField 行绑定在一起,如 0 或 1 到 1,并且不允许它们在删除父行时丢失。
如果是简单的父子关系,我可以使用标准 FK,但这里我有各种子表。

为了使一切保持一致,在SQL服务器我创建了一个复合PK(表单 ID、字段类型)在父级中FormField表和 FK 为(表单 ID、字段类型)在所有子表中FieldType设置为常数计算值(例如 0InputField表 1 中ChileField表等)。
因此,我对单个对象有一个很好的父子约束FormField和多个子特定类型表。
在 EF 方法中,要制作复合 FK,您需要所有相应字段都是 Key,因此您将 [Key] 属性放在两个字段上。
但是,如果您的特定类型表需要有自己的子表(例如ChoiceField有它的ChoiceOptions),并且您已经有一个复合密钥,那么您需要使用现有的复合密钥或添加一个新的密钥集(仅Id场地)。

因此,我的问题是使 ChoiceField 表具有两组键:一组是复合键,用于父 FieldForm 行,第二组是简单键 - 用于 ChoiceOption 子表。
使用 Fluent API,我可以添加第二个密钥。

这是我的 EF 模型:

[Table("Form")]
public class Form : IEntity
{
    [Key, Column("FormID")]
    public int Id { get; set; }

    [Required, StringLength(50)]
    public string Name { get; set; }

    public ICollection<FormField> FormFields { get; set; }
}

[Table("FormField")]
public class FormField : IEntity
{
    [Key, Column("FormFieldID", Order = 0)]
    public int Id { get; set; }

    [Key, Column(Order = 1)]
    public FieldType FieldType { get; set; }

    [ForeignKey("Form")]
    public int FormId { get; set; }

    public int OrderNo { get; set; }

    public virtual Form Form { get; set; }

    public virtual AddressField AddressField { get; set; }
    public virtual ChoiceField ChoiceField { get; set; }
    public virtual DateTimeField DateTimeField { get; set; }
// etc
}

[Table("ChoiceField")]
public class ChoiceField : BaseField, IEntity
{
    [Key, ForeignKey("FormField"), Column("FormFieldID", Order = 0)] // these keys are for parent FormField table
    public int Id { get; set; }

    [Key, ForeignKey("FormField"), Column(Order = 1)]
    public FieldType FieldType { get; set; }

    public virtual FormField FormField { get; set; }

    public ICollection<ChoiceFieldOption> ChoiceFieldOptions { get; set; }
}

[Table("ChoiceFieldOption")]
public class ChoiceFieldOption : IEntity
{
    [Key, Column("ChoiceFieldOptionID")]
    public int Id { get; set; }

    [ForeignKey("ChoiceField")] // this FK are bound to simple ChoiceField.Id key defined in fluent API
    public int ChoiceFieldId { get; set; }

    [Required, StringLength(50)]
    public string Option { get; set; }

    public int OrderNo { get; set; }

    public virtual ChoiceField ChoiceField { get; set; }
}

...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Form>();
        var eFormField = modelBuilder.Entity<FormField>();

        var eChoiceField = modelBuilder.Entity<ChoiceField>();

    // here I add a second Key for ChoiceField table
        eChoiceField.HasKey(cf => new { cf.Id });

        var eChoiceFieldOption = modelBuilder.Entity<ChoiceFieldOption>();

        modelBuilder.Entity<AddressField>();
        modelBuilder.Entity<DateTimeField>();
    // ...
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架:唯一(非主键)父字段上的复合外键 的相关文章

  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 仅具有存储过程的实体框架

    我对在我们的场景中仅使用实体框架与存储过程的合理性有疑问 我们计划拥有一个 N 层架构 包括 UI BusinessLayer BLL DataAccessLayer DAL 和 BusinessObjectDefinitions BOD
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • java.util.Properties 字段的 Spring JavaConfig

    您能告诉我如何使用 Spring Javaconfig 直接将属性文件加载 自动装配到 java util Properties 字段吗 Thanks 稍后编辑 仍在寻找答案 是否可以使用 Spring JavaConfig 将属性文件直接
  • PHPMailer 和 Gmail 对话视图

    当我们的服务器收到更新 通常与付款相关 时 我使用 PHPMailer 发送电子邮件以提供支持 我正在尝试将相关电子邮件显示为 Gmail 对话 以便支持人员更轻松地跟踪之前的更新 回复 我最初认为它是基于主题的 但这似乎没有什么区别 我的
  • 使用 setTimeout 和 Jest 测试 Promise

    我试图理解 Jest 的异步测试 我的模块有一个函数 它接受布尔值并返回值的 Promise 执行器函数调用setTimeout 并且在超时回调中 promise 会根据最初提供的布尔值进行解析或拒绝 代码如下所示 const withPr
  • 当应用程序在后台时使用 uni_links

    我的应用程序具有以下结构 InheritedWidget for dependencies gt Splash Screen Page gt Login Pages gt Main Pages 当应用程序第一次运行时 我可以使用var li
  • 使用流浪文件回答提示?

    是否可以将脚本添加到 Vagrantfile 来回答提示 我正在为 docker 配置一个 ubuntu 盒子 config vm box ubuntu config vm provision shell inline gt sudo ap
  • 更改浏览器选项卡会意外触发焦点事件,尤其是在 Google Chrome 中

    我刚刚意识到焦点事件有一个小问题 显然 当切换到另一个浏览器选项卡然后再次返回时 焦点会被触发 我宁愿不要这样的事情发生 是否可以 直到今天我才意识到这一点 这是一个小演示 http jsfiddle net MJ6qb 1 http js
  • XmlReader AppendChild 未附加相同的子值

    XmlElement updateRecipient doc CreateElement UpdateRecipient XmlElement email doc CreateElement EMAIL XmlElement listID
  • 是否有适用于 IE6 的 JavaScript PNG 修复程序允许 CSS 背景定位?

    我已经看到了一些允许 PNG 图像在 Internet Explorer 6 中具有透明度的修复 但我还没有找到一个也允许您在 CSS 中设置背景位置的修复 如果你使用精灵 那就会破坏交易 我求助于使用 GIF 质量不高 根本不使用透明图像
  • Django QuerySet 何时被评估?

    我读过 django 查询集是懒惰的 但这是否意味着懒惰 因为我可以在一个语句上链接多个操作 或者懒惰 因为查询被延迟到需要结果的时候 例如 以下模拟代码是否执行两个或三个 SQL 查询 query Books objects filter
  • StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

    两者在功能上有什么区别StreamWriter Flush and StreamWriter Close 当我的数据没有正确写入文件时 我添加了两个Flush and Close 到我的代码的末尾 然而 我意识到添加either Flush
  • 具有来自包含器类的静态方法调用的 Ruby 模块

    我需要在模块中定义使用包含该模块的类中的方法的常量 module B def self included base class lt lt base CONST self find end end end class A def self
  • 如何确保以编程方式发送的电子邮件不会被自动标记为垃圾邮件?

    这是一个棘手的问题 我一直依赖技术 例如基于许可的电子邮件 即仅发送给您有权发送的人 而不是公然使用spamish术语 最近 我以编程方式发送的一些电子邮件开始被自动混入人们的垃圾邮件文件夹中 我想知道我能对此做些什么 尽管这些特定的电子邮
  • 为什么空 python 正则表达式搜索的返回值是匹配的?

    将空字符串传递给正则表达式对象时 搜索结果是匹配对象而不是 None 因为没有任何东西可以匹配 所以它应该是 None 吗 import re m re search some text if m is None print Returne
  • 从新线程更新 JProgressBar

    如何从另一个线程更新 JProgressBar setValue int 我的第二个目标是用尽可能少的课程来完成它 这是我现在的代码 Part of the main class pp addActionListener new Actio
  • 在 F# 中组合谓词

    F 中是否有逻辑组合谓词的标准方法 例如 假设我有isCar x and isBlue x然后我想要一些能给我的东西 let isBlueCar x isCar x isBlue x 但是使用某种组合而不是调用 可能像 let isBlue
  • 扫描大量BLE标签

    我一直在寻找在一次扫描中扫描大量 BLE 标签 StickNFind 的可能性 我注意到 当我扫描 10 秒时 我可以轻松检测到大约 20 个 BLE 当我将扫描间隔增加到 30 秒左右并尝试扫描大量 BLE 标签时 例如200 个标签 我
  • WPF:无法控制键盘焦点

    这周我遇到了一个让我陷入困境的问题 总而言之 问题是当我左键单击另一个控件时 我无法从代码中将键盘焦点赋予 ComboBox 具体来说 我有一个 CustomControll 它有一个 Scrollview 其中包含另一个 CustomCo
  • 与使用类相比,在 Program.cs/main 中编写代码是否有充分的理由? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在开发一个相当大的应用程序 而我的技术主管和我在某些事情上的看法并不一致 其中之一是关于控制台应用程序 这些应用程序正在从 shell 脚本移植到
  • 无法在我的 Maven 项目中使用依赖项 jboss-javaee-6.0

    我已经使用 JBoss 7 1 1 设置了一个 Maven 项目 我想使用 JavaEE 库 在根 pom xml 中我设置了
  • 实体框架:唯一(非主键)父字段上的复合外键

    我有一个表需要通过其绑定到另一个表Id列 并按其第三个表 Id Code 列 我可以轻松地做SQL服务器同时使用主键和唯一索引 但不知道如何实现它实体框架 如果我把 Key 两列上的属性 那么我无法创建第一个关系 否则 如果我只申请一个 K