如何首先定义嵌套的识别关系实体框架代码

2023-11-22

我目前首先在一个简单的测试应用程序中使用 EF5 代码来测试各种功能。我定义了两个实体之间的“识别关系”,表示一对多链接。这里我定义了一个 PhotoCollection,它有很多子 Photo 实体;

public class PhotoCollection
{
    public int Id { get; set; }
    public virtual ISet<Photo> Photos { get; private set; }

    public PhotoCollection()
    {
        Photos = new HashSet<Photo>();
    }
}

public class Photo
{
    [Key, ForeignKey("Parent"), Column(Order = 1)]
    public int PhotoCollectionId { get; set; }

    [Key, Column(Order = 2)]
    public int PhotoId { get; set; }

    public virtual PhotoCollection Parent { get; set; }


    [Required, MaxLength(200)]
    public string FilePath { get; set; }

    public Photo()
    {
    }

}

我的 OnModelCreating 实现包括:

modelBuilder.Entity<Photo>().Property(p => p.PhotoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

结果是,当我删除照片集时,所有照片实体也会被删除,这是由“识别关系”提供的。伟大的。

我的问题是如何在此对象图中定义进一步的级别,假设我想要将 PhotoProperties 作为 Photo 的一对多集合。在这种情况下,我想删除 PhotoCollection,所有相应的 Photo 和 PhotoProperty 记录也将被删除。使用上面的方法,是否有必要向 PhotoProperty 添加一个指向 PhotoCollection 的 GrandParent 属性?

我可以在模型构建器中使用 Fluent Api 获得相同的结果吗?

我在网上找到的唯一示例是单级父>子层次结构。

提前致谢。


在我看来这应该有效:

public class Photo
{
    [Key, ForeignKey("Parent"), Column(Order = 1)]
    public int PhotoCollectionId { get; set; }

    [Key, Column(Order = 2)]
    public int PhotoId { get; set; }

    public virtual PhotoCollection Parent { get; set; }

    public virtual ISet<PhotoProperty> PhotoProperties { get; private set; }

    //...
}

public class PhotoProperty
{
    [Key, ForeignKey("Parent"), Column(Order = 1)]
    public int PhotoCollectionId { get; set; }

    [Key, ForeignKey("Parent"), Column(Order = 2)]
    public int PhotoId { get; set; }

    [Key, Column(Order = 3)]
    public int PhotoPropertyId { get; set; }

    public virtual Photo Parent { get; set; }

    //...
}

注意PhotoCollectionId in PhotoProperty不指的是PhotoCollection但是复合外键的一部分(PhotoCollectionId,PhotoId)指的是Photo.

是的,您可以使用 Fluent API 定义整个映射:

modelBuilder.Entity<PhotoCollection>()
    .HasMany(pc => pc.Photos)
    .WithRequired(p => p.Parent)
    .HasForeignKey(p => p.PhotoCollectionId);

modelBuilder.Entity<Photo>()
    .HasKey(p => new { p.PhotoCollectionId, p.PhotoId });

modelBuilder.Entity<Photo>()
    .Property(p => p.PhotoId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

modelBuilder.Entity<Photo>()
    .HasMany(p => p.PhotoProperties)
    .WithRequired(pp => pp.Parent)
    .HasForeignKey(pp => new { pp.PhotoCollectionId, pp.PhotoId });

modelBuilder.Entity<PhotoProperty>()
    .HasKey(pp => new { pp.PhotoCollectionId, pp.PhotoId, pp.PhotoPropertyId });

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

如何首先定义嵌套的识别关系实体框架代码 的相关文章

随机推荐

  • 如何获取Web配置位置元素?

    如何获取Web配置位置元素 ConfigurationManager GetSection appSettings returns Okay ConfigurationManager GetSection location return n
  • Pyinstaller 语法错误:异步函数内的“yield”(Python 3.5.1)

    我正在尝试使用pyinstaller创建单个可执行文件以分发给未安装 Python 的用户 该脚本非常简单 只是为了测试水 我仅使用几行代码作为 豚鼠 The Hello World程序 无需导入 转换良好 我的豚鼠程序 导入matplot
  • matplotlib 图中交互式选择系列

    我一直在寻找一种方法 能够在创建绘图后选择绘图上可见的系列 我需要这个 因为我经常有很多系列的情节 它们太多了 无法同时绘制 我需要快速交互地选择哪些系列可见 理想情况下 会有一个窗口 其中包含绘图和复选框中的系列列表 其中带有选中复选框的
  • 共享 Git 存储库中的 .editorconfig

    我已经准备好了我的 editorconfig我想在多个 Git 存储库上使用的文件 每个存储库都包含一个 Visual Studio 解决方案 C 我的第一个想法是把 editorconfig文件放在自己的存储库中 然后将其作为子模块包含在
  • Rust 中的泛型部分专业化

    让我们看一些数学向量的例子 根据空间维度 它由不同数量的组件组成 对于 2D x y 对于 3D x y z 对于 4D x y z w 通用 N 个组件 在C 中我可以使用SFINAE概念来实现它 template
  • 当我使用 Md5 哈希文件时,哈希了什么?

    仅仅是文件内容被散列吗 有没有办法将文件名和 或元数据 例如创建日期 包含到哈希过程中 一般来说 所有文件哈希器仅加密文件的二进制内容 您可以通过以下过程来证明这一点 将 md5 算法应用于文件 将此文件复制到其他目录并更改其名称 对副本应
  • 如果单独的活动中发生更改,则 onSharedPreferenceChanged 不会被触发?

    我已经实施了onSharedPreferenceChanged在我的主要活动中 如果我更改主要活动中的首选项 我的事件就会触发 如果我通过我的首选项屏幕更改首选项 PreferenceActivity 当首选项更改时 我的事件不会触发 因为
  • 错误:找不到与给定名称匹配的资源(在“icon”处,值为“@mipmap/Icon”)

    这是我第一次尝试 Xamarin 只是运行了以下示例Xamarin com 但是当我尝试构建时出现此错误 这很奇怪 因为我可以从属性选项卡上的列表中选择图标 但 VS 在构建过程中找不到它们 我尝试过移动文件 因此路径非常短 我尝试添加具有
  • 如何通过tensorflow的tf.data API加载pickle文件

    我的数据存储在磁盘上的多个 pickle 文件中 我想使用tensorflow的tf data Dataset将数据加载到训练管道中 我的代码是 def parse file path image label load pickle fil
  • 类型“String”不符合协议“SequenceType” - Swift 2.0

    我试图在 Swift 2 0 中反转字符串 但在字符串 ifself 上出现错误 func reverseString string String gt String var buffer for character in string b
  • 如何在node.js沙箱中安全地运行用户提交的脚本?

    在 Node js 中安全运行 可能是恶意的 用户提交的脚本有哪些选项 IE 在阻止代码访问敏感数据和 API 的环境中 vm runInNewContext userScript 是一个诱人的起点 但似乎有已知的问题 there The
  • IE10 User-Agent导致ASP.Net不发回Set-Cookie(IE10不设置cookie)

    Summary ASP Net 不发回Set Cookie使用 IE 10 时的标头 这意味着 例如 在使用表单身份验证时 您无法使用 IE10 登录 ASP Net 站点 Detail 我们目前正在针对 IE 10 预览版 2 测试我们的
  • 在卡萨布兰卡设置基本 HTTP 身份验证

    我正在尝试修改卡萨布兰卡教程包括基本的 HTTP 身份验证以访问繁荣API auto fileStream std make shared
  • 在 ASP.NET 中重新生成 SessionID

    请建议如何在 ASP NET 中重新生成新的会话 ID 如果我们使用 SessionManager 生成新的 id 那么它不会更改 Session SessionID 的值 请建议如何实现这一目标 基本上我想在放弃 Session 或使用
  • 如何通过单击电子邮件超链接打开 Outlook

    我有一个表 其中一列是电子邮件地址 我需要添加到此电子邮件地址的超链接 以便单击它会打开 Outlook 其中的电子邮件地址为TO field 有人可以帮忙吗 Try this a href title title Email a 这里 A
  • 在 iPhone 中以编程方式获取用户的 AppleId

    是否可以获取当前登录设备的用户的Apple ID 实际上 我实现了应用内购买 并且在用户购买应用程序时获得了设备 ID 和 Apple ID 不 这是不可能的 您可以使用 UIDevice currentDevice identifierF
  • Python:创建动态函数

    我有一个问题 我想创建动态函数 该函数将根据从数据库检索的值进行一些计算 我很清楚我的内部计算 但问题是如何创建动态类 我的结构是这样的 class xyz def Project start 2011 01 03 def Phase1 e
  • Java/Tomcat 被黑客攻击 [已关闭]

    Closed 这个问题是无关 目前不接受答案 最近我的 tomcat 服务器上出现了一些明显是黑客企图的文件 我支持使用 struts 和 ibatis 以及各种其他框架的旧应用程序 创建了三个文件 一个是实际 webapp 目录下的 sy
  • 升级到 JUnit4 并通过一起运行旧版 JUnit 3 测试和测试套件来保留它们

    我很惊讶到目前为止还没有找到答案 如果我错过了一些基本的东西 我会非常高兴知道这一点 有一个大型遗留代码库已升级到 Java 6 从 1 4 代码中存在大量 JUnit 3 测试 并被组织成测试套件 可以使用 Eclipse 中的 JUni
  • 如何首先定义嵌套的识别关系实体框架代码

    我目前首先在一个简单的测试应用程序中使用 EF5 代码来测试各种功能 我定义了两个实体之间的 识别关系 表示一对多链接 这里我定义了一个 PhotoCollection 它有很多子 Photo 实体 public class PhotoCo