如何定义两个实体之间的多重关系?

2024-04-01

我有一个场景user可以上传多个photos(一对多)。这user还可以有默认照片(一对一)。然而,我实体框架core 2.0告诉我当我使用以下代码时他无法识别这种关系:

public class User
{
    public Guid Id { get; set; }

    public ICollection<Photo> Photos{ get; set; }

    public Photo DefaultPhoto { get; set; }
    [ForeignKey("DefaultPhoto")]
    public Guid DefaultPhotoId { get; set; }
}

public class Photo
{
    public Guid Id { get; set; }

    public User Owner { get; set; }
}

我怎样才能建立这些多重关系?

EF-Core 显示错误:

System.InvalidOperationException:“无法确定“User”类型的导航属性“Photo.Owner”表示的关系。手动配置关系,或者使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

UPDATE:

Adding [InverseProperty("Photos")]到导航属性Owner在文件模型中似乎正在工作。我不确定这是否是正确的方法?

enter image description here In this image File=Photo; Uploader=Owner (to be comparable with the above model).

更新2:

我确认@Ivan 在评论中所说的,通过 DataAnnotation 方法,我在两个方向上得到一对多,而不是一对多和一对一。该图显示了使用生成的数据库InverseProperty(to实体之间的连接显示双向一对多关系):

在此图像中 File=Photo; Uploader=Owner(与上述模型相当)。


使用 Fluent API 建立一对一关系:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // Establish a one to one relationship with the
    // User as the dependent End
    modelBuilder.Entity<User>()
        .HasOne(u => u.DefaultPhoto)
        .WithOne(p => p.Owner)
        .HasForeignKey<User>(u => u.DefaultPhotoId);
}

对于一对一的关系(1:0..1) 关系,必须在两个主键或两个候选键之间建立关系。 (查看这篇博文 https://gldraphael.com/blog/notes-on-database-relationships/有关这方面的更多信息。)

EF 目前无法通过注释设置候选键(也称为唯一键或备用键),因此这是您唯一的选择。在 Microsoft Docs 中查看 EF 文档:一对一的关系 https://learn.microsoft.com/en-us/ef/core/modeling/relationships#other-relationship-patterns


Update:早期的代码会自动生成一个UserId列并正确设置关系。我已经添加了OwnerId场到Photo实体手动设置关系,就像您想要的那样:

public class User
{
    public Guid Id { get; set; }

    [InverseProperty("Owner")]
    public ICollection<Photo> Photos{ get; set; }

    public Photo DefaultPhoto { get; set; }
    public Guid DefaultPhotoId { get; set; }
}

public class Photo
{
    public Guid Id { get; set; }

    public Guid OwnerId { get; set; }
    public User Owner { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Photo> Photos { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // You may use this instead of the inverse property
        // // The One to Many relationship between
        // // User.Id (Principal End) and Photo.OwnerId
        // modelBuilder.Entity<Photo>()
        //     .HasOne(p => p.Owner)
        //     .WithMany(u => u.Photos)
        //     .HasForeignKey(p => p.OwnerId);

        // Establishes 1:0..1 relationship between
        // Photo.Id (Principal End) and User.DefaultPhoto (Dependent end)
        modelBuilder.Entity<User>()
            .HasOne(u => u.DefaultPhoto)
            .WithOne() // we leave this empty because it doesn't correspond to a navigation property in the Photos table
            .HasForeignKey<User>(u => u.DefaultPhotoId);
    }
}

诀窍在于确定关系(尤其是主体端和从属端)以及确定哪些关系需要导航属性。

Inverse 属性是必需的,因为 EF 不知道要映射到哪个属性Photo.Owner。这只是在此类情况下明确关系的一种方式。

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

如何定义两个实体之间的多重关系? 的相关文章

随机推荐

  • 将 Firebase 主题消息与 Android 通知通道结合使用

    我有一个可以接收不同通知类型的应用程序 例如News and Podcast 目前它有两个简单的开关 用户可以在其中启用和禁用这些不同的通知类型 它的工作原理是订阅和取消订阅该类型相应的 Firebase 主题 明显的优势是设备仅接收用户想
  • 如何在 Google Cloud 上的 Kubernetes 中备份 Postgres 数据库?

    备份运行于其上的 Postgres 数据库的最佳实践是什么谷歌云容器引擎 https cloud google com container engine 我的想法是努力将备份存储在谷歌云存储 https cloud google com s
  • 比较 C 中 char[] 的相等性

    我有两个变量 char charTime TIME char buf SOMETHINGELSE 我想检查这两个是否相等 使用charTime buf不起作用 我应该使用什么 有人可以解释为什么使用 不起作用 这个动作在 C 和 C 中会有
  • fatal: 似乎不是 git 存储库

    当我的 Git 存储库 URL 正确时 为什么会收到此错误 fatal email protected cdn cgi l email protection gittest git does not appear to be a git r
  • 如何管理/删除我的 Azure 逻辑应用连接

    我们正在 Azure 中构建一个逻辑应用程序 它由 Office 365 新邮件项目和服务总线队列项目组成 我们无法解决的是如何管理 删除连接 任何建议将不胜感激 参考MSDN博客 https blogs msdn microsoft co
  • 用jquery查找字符串中最后一个单词的第一个字母(字符串可以有多个单词)

    嘿 有没有办法找到字符串中最后一个单词的第一个字母 这些字符串是 XML 解析器函数的结果 在each 循环内 我获取所有节点并将每个名称放入变量中 如下所示 var person xml find name find text 现在 pe
  • 如果 Woocommerce 上的购物车中有特定商品,请更改购物车商品价格

    我正在使用 WooCommerce 会员资格 并且希望向购买特定产品的首次会员提供免费会员资格 我可以让其中一些单独工作 但很难将它们全部组合在一起 他们必须购买的商品也有促销价 因此我也会检查日期以查看该商品是否在促销窗口中 那部分正在工
  • SVG 在 Android 中保留纵横比

    我在 Android 手机上遇到 SVG 缩放问题 我网站的几个部分是基于通过嵌入的 SVG 的宽度和高度尺寸 img 标签 所有浏览器 除了Android 4 1 2 原生浏览器 非 Chrome 正确 完美地缩放 SVG 不会扭曲纵横比
  • 如何在 FastAPI 中进行多处理

    在提供 FastAPI 请求时 我需要对列表中的每个元素执行一项 CPU 密集型任务 我想在多个 CPU 核心上进行此处理 在 FastAPI 中执行此操作的正确方法是什么 我可以使用标准吗multiprocessing模块 到目前为止我发
  • ROWID (oracle) - 有什么用吗?

    我的理解是 ROWID 是查询返回的结果中每一行的唯一值 为什么我们需要这个ROWID ORACLE中已经有ROWNUM了 有人在 SQL 查询中使用过 ROWID 吗 ROWID 是行的物理位置 因此 它是定位行的最快方法 甚至比主键查找
  • 在构建过程中将静态库链接到共享库?

    我在使用 GCC Linux 构建共享库时遇到问题 目前这个共享库是使用 GCC libtool 选项 shared 创建的 一切都很好 现在必须将两个额外的静态库 a 文件 添加到此共享库中 因为它们提供了共享库所需的一些功能 使用选项
  • 该通道未配置任何具有“发现”角色的对等方

    我正在尝试从 java Fabric SDK 进行事务处理 我能够从节点正确查询数据 但在执行事务时出现以下错误 org hyperledger fabric sdk exception ServiceDiscoveryException
  • 类型定义字符串中的元素数量与第 8 行 /home/a3598479/public_html/Register.php 中的绑定变量数量不匹配

    请帮我 我实际上并不使用 PHP 但我需要在我的登录 注册项目中使用 con mysqli connect name POST name username POST username password POST password state
  • iOS 启动图像不会显示在 iPhone 或模拟器上,但可在 iPad 上显示

    无论我使用资产目录还是传统方式 我都会遇到这个问题 所有情况下均使用 Xcode 5 1 1 我已经输入了所有图像 并且 Xcode 没有给出 您缺少 568 h 错误或任何其他信息 但是当我启动应用程序时 我的启动图像仅显示在 iPad
  • SQL Server 2005:可为空的外键约束

    我在表会话和用户之间有外键约束 具体来说 Sessions UID Users ID 有时 我希望 Sessions UID 为空 这可以被允许吗 每当我尝试这样做时 我都会遇到 FK 约束违规 具体来说 我通过 LINQ 将一行插入到 S
  • 单例模式与 Web 应用程序,不是一个好主意!

    我发现了一些有趣的东西 我在调试其他东西时幸运地注意到了它 我正在应用 MVP 模式 并制作了一个单例控制器以在所有演示文稿之间共享 突然我发现有些事件在第一次回发时被调用一次 如果有两次回发则调用两次 如果有100次回发则调用100次 因
  • JavaScript 错误:“不是构造函数”

    我使用backbone js以及jquery和underscore js 这是我的一些代码 它还没有做任何事情 奇怪的是 点击 url users 后没有错误 发生错误的唯一一次是当我单击转到不同的哈希 然后单击返回转到 users 时 这
  • 在Python中动态评估简单的布尔逻辑

    我有一些动态生成的布尔逻辑表达式 例如 A 或 B 和 C 或 D A 或 A 和 B A 空 计算结果为 True 占位符被替换为布尔值 我是不是该 将此信息转换为 Python 表达式 例如True or True or False a
  • 如何模拟dbcontext?

    我正在使用实体框架核心 1 0 rc2 这是班级 public class ApplicationDbContext DbContext public ApplicationDbContext DbContextOptions
  • 如何定义两个实体之间的多重关系?

    我有一个场景user可以上传多个photos 一对多 这user还可以有默认照片 一对一 然而 我实体框架core 2 0告诉我当我使用以下代码时他无法识别这种关系 public class User public Guid Id get