在 Entity Framework Core 中使用两列的一对多关系

2024-03-19

在我的项目中我有一张桌子Translation可以有任何模型的翻译。为了实现这一点,该表有两个字段:Model and ModelId. The Model属性保存一个整数,指示模型的类型和ModelId有这个模型的id。
因此,例如:Product表有 modeltype id1。获取具有 id 的产品的所有翻译317,我搜索翻译Model=1 AND ModelId=317.

现在我想在 Entity Framework Core 中创建这种关系。我所有的模型都继承自该类BaseModel拥有财产的ModelType保存模型类型的 id。该字段未映射,因此在数据库中不可用。

我尝试使用 Fluent api 创建关系,但它不允许我指定更多要过滤的列。

modelBuilder.Entity<BaseModel>()
    .HasMany<Translation>(bm => bm.Translations)
    // Extra filters

有没有办法创建这种关系,而不必为每个需要翻译的查询手动创建联接?


Since modelBuilder.Entity<BaseModel>()将使用TPH继承方法,我假设您没有使用 EF 代码优先方法来创建数据库,而是使用它将模型映射到现有数据库。然后你可以尝试这样的事情:

Models:

public class Translation
{
    public int Id { get; set; }
    public int Model { get; set; }
    public int ModelId { get; set; }
}

public class BaseModel
{
    public BaseModel(int modelType)
    {
        ModelType = modelType;
    }
    public int Id { get; set; }
    public int ModelType { get; set; }

    public ICollection<Translation> Translations { get; set; }// only for internal use
    public IEnumerable<Translation> ModelTypeTranslations
    {
        get
        {
            return this.Translations.Where(t => t.Model == this.ModelType);
        }
    }

}

public class SomeModel : BaseModel
{
    public SomeModel() : base(1) { }
    public int SomeProperty { get; set; }
}

public class AnotherModel : BaseModel
{
    public AnotherModel() : base(2) { }
    public int AnotherProperty { get; set; }
}

数据库上下文:

public class MyDbContext: DbContext
{
    ...

    public DbSet<Translation> Translations { get; set; }
    public DbSet<SomeModel> SomeModels { get; set; }
    public DbSet<AnotherModel> AnotherModels { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        ...
        modelBuilder.Entity<Translation>().HasKey(e => e.Id);

        var baseModelTypes = typeof(BaseModel).Assembly.GetExportedTypes()
            .Where(t => typeof(BaseModel).IsAssignableFrom(t) && t != typeof(BaseModel)).ToList();

        foreach (var type in baseModelTypes)
        {
            modelBuilder.Entity<Translation>().HasOne(type).WithMany(nameof(BaseModel.Translations)).HasForeignKey(nameof(Translation.ModelId));

            modelBuilder.Entity(type).Ignore(nameof(BaseModel.ModelType));
            modelBuilder.Entity(type).Ignore(nameof(BaseModel.ModelTypeTranslations));
            modelBuilder.Entity(type).HasKey(nameof(BaseModel.Id));
        }
    }
}

正如你所看到的,你可以使用ModelTypeTranslations仅获取当前模型类型的翻译。

我应该注意这种方法可能存在性能问题,因为它会过滤Translations by ModelType只存在于记忆中。我还尝试通过使用来避免在内存中进行过滤lazy loading https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Proxies/但我得到了一些例外 https://github.com/aspnet/EntityFrameworkCore/issues/11704即使我只是安装了该软件包而不调用optionsBuilder.UseLazyLoadingProxies()。我希望它能在下一个版本中得到修复。

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

在 Entity Framework Core 中使用两列的一对多关系 的相关文章

  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2

随机推荐

  • 如何对不同形状使用同一组修改器

    作为我学习 SwiftUI 项目的一部分 我做了一些形状旋转 下面有代码 我想知道如何避免每个形状使用相同的三行修饰符 func getShape shape Int i Int gt AnyView switch shape case 0
  • 为什么当我“使用”BinaryReader 对象时我的 FileStream 对象被释放?

    考虑以下函数 private int GetSomethingFromFile FileStream fs using BinaryReader br new BinaryReader fs fs Seek 0 SeekOrigin Beg
  • 线程和多处理模块之间有什么区别?

    我正在学习如何使用threading和multiprocessingPython 中的模块可并行运行某些操作并加速我的代码 我发现这很难 也许是因为我没有任何理论背景 来理解threading Thread 对象和一个multiproces
  • 如何检查可见 DOM 中是否存在元素?

    如何在不使用getElementById method 我已经设置了一个现场演示 http jsbin com apawi5 3以供参考 我还将在这里打印代码
  • 如何在 python 中实现“#ifdef”?

    编程于C我曾经有代码部分仅用于调试目的 记录命令等 通过使用这些语句可以完全禁用生产 ifdef预处理器指令 如下所示 ifdef MACRO controlled text endif MACRO 做类似事情的最好方法是什么python
  • 神经网络立即过拟合

    我有一个带有 2 个隐藏层的 FFNN 用于几乎立即过拟合的回归任务 epoch 2 5 取决于 个隐藏单元 ReLU Adam MSE 每层相同的隐藏单元数 tf keras 32 个神经元 128 个神经元 我将调整隐藏单元的数量 但为
  • Q_PROPERTY:成员与读/写

    我正在阅读 Qt 5 5 关于 Q PROPERTY 宏的文档 但我不能很好地理解它 据我所知 您可以在此宏中使用关键字 MEMBER 或访问器 READ WRITE 来代替 如果您使用关键字 MEMBER 则不必编写访问器 因为您可以使用
  • 如何重新编译Google Drive API sdk?

    这是我们的问题 如何在dotnet中重新编译Google Drive api sdk gt 我们没有找到源代码 gt 在二进制包中 有一个源文件未随项目一起提供 我们不知道如何处理它 提问原因 在 dotnet 中 我们无法使用从 Goog
  • mysqlnd_ms 错误 - getaddrinfo 失败,mysqlnd_global_stats 未知

    我正在尝试设置 mysqlnd ms 以便它达到在从属数据库上读取和在主数据库上写入的目的 但是 当 httpd 重新启动时 我收到此错误 PHP Warning PHP Startup Unable to load dynamic lib
  • ASP.NET Core 中的 IHttpActionResult 和辅助方法

    我正在尝试将我的 web api 2 项目移动到 ASP NET 5 但我有很多不再存在的元素 例如IHttpActionResult or Ok NotFound 方法 或者RoutePrefix 我应该改变每一个IHttpActionR
  • VS2005中如何将静态库项目转换为dll项目

    当我在vs2005中创建一个项目时 我还可以创建 Win32 gt Win32Project 我可以选择 控制台应用程序 或 dll 或 静态库 如果我创建了一个静态库项目 我怎样才能将它转换为dll项目 我在创建的项目的设置面板中找到了
  • MySQL系统数据库表可以转换为InnoDB吗?

    我最近安装了MySQL 5 5 我在用着InnoDB作为我所有数据库的引擎 我注意到mysql数据库默认值及其所有表 用户 数据库等 都是MyISAM 有什么理由他们不能 不应该InnoDB 有谁知道 MySQL 是否需要mysql数据库是
  • 线程内存布局

    我了解进程内存布局的样子 代码 数据 堆 堆栈 但是 我不明白具有多个线程的程序的内存布局究竟是什么样的 毕竟 该进程有一个堆栈 所以我假设所有线程都以某种方式共享相同的堆栈 但这似乎不对 因为每个线程都有自己的堆栈 并且不能保证线程按照调
  • 从 shell_exec() 获取输出和退出状态

    当做类似的事情时 output shell exec command 2 gt 1 收集命令的 stdout 和 stderr output 有没有办法找到命令的退出状态 人们可以将命令输出写入临时文件 然后附加退出状态 但这相当笨重 还有
  • $_SERVER['REQUEST_URI'] 和 header('location: ...') 的任何安全问题;

    我的网站有页眉 页脚和主要内容 如果用户未登录 则对于主要内容 可能会显示登录表单而不是实际内容 在该登录表单上我写了 SERVER REQUEST URI 在会话变量中 SESSION redirect 我的登录表单后处理程序将登录用户
  • Lucene中的geohash索引是如何工作的

    在 lucene space 4 中 我想知道 geohash 索引在幕后是如何工作的 我理解 geohash 的概念 它基本上需要 2 个点 纬度 经度 并创建一个 字符串 哈希 索引只是一个 字符串 索引 r 树或四叉树 还是类似的东西
  • 如何捕获 lambda 表达式内外部变量的值?

    我刚刚遇到以下行为 for var i 0 i lt 50 i Task Factory StartNew gt Debug Print Error i ToString 会导致一系列 Error x 其中大多数x等于50 相似地 var
  • memcpy 在 Linux 中移动 128 位

    我正在 Linux 中为 PCIe 设备编写设备驱动程序 该设备驱动程序执行多次读取和写入来测试吞吐量 当我使用 memcpy 时 最大有效负载TLP https en wikipedia org wiki PCI Express Data
  • Kotlin 是否支持类似于 Swift 中的协议组合的接口组合或未来有计划吗?

    到目前为止我发现的答案可能是否定的 但我想知道未来是否有任何计划支持此功能 这是 Swift 中的样子 协议组合的形式为 SomeProtocol AnotherProtocol 您可以根据需要列出任意多个协议 并用与号 分隔它们 除了协议
  • 在 Entity Framework Core 中使用两列的一对多关系

    在我的项目中我有一张桌子Translation可以有任何模型的翻译 为了实现这一点 该表有两个字段 Model and ModelId The Model属性保存一个整数 指示模型的类型和ModelId有这个模型的id 因此 例如 Prod