不声明外键的导航属性

2024-01-12

我的所有模型都至少包含两个关联。在 ef4 中对此进行建模时,我只能通过使用流畅的接口在没有第二个外键属性的情况下做到这一点。 foreignKey 似乎是正确使用的属性,除了它需要一个字符串参数这一事实。

所以我的问题是,您可以拥有一个导航属性并使用属性来声明它吗?

public class User : IAuditable
{
    // other code

    public virtual User Creator { get; set; }

    public virtual User Modifier { get; set; }
}

我认为,仅用数据属性来定义关系是不可能的。问题是 EF 的映射约定假设Creator and Modifier是同一关系的两端,但无法确定该关联的主体和从属关系。据我在支持的属性列表中看到,没有选项可以使用数据注释来定义主体和从属端。

除此之外,我猜你实际上想要两种关系,两者的末端均未在模型中暴露。这意味着您的模型在映射约定方面是“非常规的”。 (我认为之间的关系Creator and Modifier实际上是无稽之谈——从语义的角度来看。)

因此,在 Fluent API 中,您需要这样:

modelBuilder.Entity<User>()
            .HasRequired(u => u.Creator)
            .WithMany();

modelBuilder.Entity<User>()
            .HasRequired(u => u.Modifier)
            .WithMany();

因为一个User可以是许多其他用户记录的创建者或修改者。正确的?

如果您想在不使用 Fluent API 而仅使用 DataAnnotations 的情况下创建这两种关系,我认为您必须将关联的多端引入到模型中,如下所示:

public class User
{
    public int UserId { get; set; }

    [InverseProperty("Creator")]
    public virtual ICollection<User> CreatedUsers { get; set; }
    [InverseProperty("Modifier")]
    public virtual ICollection<User> ModifiedUsers { get; set; }

    [Required]
    public virtual User Creator { get; set; }
    [Required]
    public virtual User Modifier { get; set; }
}

我在这里假设Creator and Modifier是必需的,否则我们可以省略[Required]属性。

我认为这是一个明显的例子,使用 Fluent API 很有意义,并且比仅仅为了避免 Fluent 配置而修改模型更好。

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

不声明外键的导航属性 的相关文章

随机推荐

  • 我可以在Windows下改变python ttk组合框的颜色吗?

    我在 Linux 下得到了工作代码 用于更改 python 2 7 下 Ttk 的 TCombobox 的外观 如果我在windows下运行代码 它不会工作 我知道 ttk 小部件的颜色和属性是依赖于平台的 我仍然不知道如何更改 Windo
  • 未找到 MY_Controller 类

    我想解决的主要问题是当有人想要访问管理面板时检查用户会话 我已经创建了 MY Controller 类并将其放入库中 class MY Controller extends CI Session public logged in FALSE
  • Android Viewpager EdgeEffect自定义颜色

    我正在尝试在我的应用程序的 Viewpager 中自定义 EdgeEffect 目的是用定制的红色 ics Overscroll EdgeEffect 替换蓝色 ics Overscroll EdgeEffect 所以一开始我编辑了过度滚动
  • cuda 3D纹理插值

    我正在尝试使用纹理内存和下面的代码通过 cuda 插入 3D 数组 我已将输入 f x y z 绘制为固定的 z 值 然后为 x 和 y 插入数组并再次绘制 i 它们看起来完全不同 我还在一维中尝试过这个 使用不同的代码 并且它在那里工作
  • 如何处理 UsernameNotFoundException spring security

    如何处理UsernameNotFoundException 在 Spring Security 中 当用户名未找到时UserDetailsService实现抛出一个UsernameNotFoundException 例如这样 Overrid
  • 将 UIDatePicker 从 12 小时制更改为 24 小时制并返回

    很抱歉 我的第一个问题有点简单 我花了一天时间阅读 NSLocale 和 NSCalendar 类描述 但我不知道这是否可能 我有一个 UIDatePicker 处于 UIDatePickerModeDateAndTime 模式 当前它根据
  • Java 正则表达式中的 POSIX 字符等效项

    我想在Java中使用这样的正则表达式 a e i 但是Java不支持POSIX类 a e etc 我怎样才能做到这一点 更准确地说 有没有办法不使用 US ASCII Java确实支持posix 字符类 http download orac
  • 使用 micronaut-data-hibernate-jpa 库连接到 jpa 时出现错误

    我想将 JPA 用于 micronaut 为此我正在使用io micronaut data micronaut data hibernate jpa 1 0 0 M1图书馆 每当我运行应用程序并点击端点来获取数据时 我都会收到以下错误 me
  • Keycloak / SpringBoot - OpenID 配置中提供的颁发者 与请求的颁发者 不匹配

    我对我刚刚加入的项目有疑问 技术栈 Jhipster 与 Angular 和 SpringBoot Keycloak 我将正确的网址替换为 example com 和 bar com 应用程序 yaml https i stack imgu
  • Html.Action - 获取与发布

    我经常这样做 div Html Action Create Product div 这很方便 因为我可以将产品创建表单的绘制委托给另一个控制器操作以嵌入到某个位置 但是 我遇到的问题是 该方法有时 我还没有弄清楚在什么条件下 会调用我的控制
  • 我如何知道鼠标指针是否位于 HTML 元素上?

    我有一个定时事件 我想根据鼠标指针所在的 HTML 元素采取不同的行为 假设我有 HTML 元素 有没有办法知道鼠标指针当前是否位于其顶部 我很了解 onmouseover onmouseout 事件以及如何使用它们 我正在使用 JQuer
  • 多个外键?

    我有一张表 用于跟踪将产品从一个供应商运送到另一个供应商的天数和成本 我们 非常出色 p 将运输供应商 FedEx UPS 和产品处理供应商 Think Dunder Mifflin 存储在 VENDOR 表中 因此 我的 SHIPPING
  • 使用硬浮点时使用 gcc 交叉编译简单示例时出现问题

    当我尝试编译一个简单的例子时test c int main return 0 对于具有硬浮点 ABI 的 cortex m7 目标 使用以下调用 arm none eabi gcc mcpu cortex m7 mfpu fpv5 d16
  • 类型错误:res.json 不是函数

    我正在尝试发送两个 json 但它不起作用 它打印TypeError res json is not a function但我不明白为什么会发生 有什么想法吗 谢谢 app post danger function response req
  • GWT XML(xml 对象映射)

    在 Java 中 我们可以使用 JAXB 等工具自动为我们进行类对象映射 但是在 GWT 中 由于反射有限 JAXB 不可用 唯一的方法是 Document messageDom XMLParser parse messageXml Nod
  • 为什么在 CLOB 上使用 REPLACE 函数会导致 CACHE_LOBS 增加...?

    我需要在 CLOB 变量上使用内置 REPLACE 函数 作为更大的 PL SQL 流程的一部分 我使用的是 Oracle 11g R2 该函数工作正常 因为它根据需要进行替换 但随着过程运行 大约有 250 万条记录需要处理 它的速度严重
  • Prolog的append有什么问题?

    根据我大学的逻辑课程 对于以下查询 我们可以预期得到与 Prolog 定义不同的结果 append a X 统一为X a 但我不明白他们的目的是什么 考虑到附加应该统一 X 在本例中 的串联 应该期望什么作为有效响应 and a 我认为他们
  • Django 加密 url 中的主键

    我环顾四周 但仍然对如何安全地加密 django 应用程序的 url 中的主 ID 感到不舒服 我的网址如下 http www example com primary1 id primary2 id testing 例如 http www
  • 这是什么:[Ljava.lang.Object;?

    当我打电话时我得到这个toString在我从函数调用收到的对象上 我知道该字符串中编码了对象的类型 但我不知道如何读取它 这种类型的编码叫什么 Ljava lang Object 是的名字Object class the java lang
  • 不声明外键的导航属性

    我的所有模型都至少包含两个关联 在 ef4 中对此进行建模时 我只能通过使用流畅的接口在没有第二个外键属性的情况下做到这一点 foreignKey 似乎是正确使用的属性 除了它需要一个字符串参数这一事实 所以我的问题是 您可以拥有一个导航属