c# - Entity Framework 6 可以从分隔字符串列映射外键吗?
问题描述
我正在尝试从一个数据库中读取,不幸的是,该数据库被设计为将外键存储在分隔字符串而不是单独的表中,并且我没有更改数据库结构的选项。举个例子:
表格1 -Person
ID | 姓名 | 水果 |
---|---|---|
1 | “鲍勃” | “1;3;5” |
2 | “戴夫” | “2;4;6” |
3 | “玛丽” | “1;2;3” |
4 | “简” | “4;5;6” |
表 2 -Fruit
ID | 姓名 |
---|---|
1 | “苹果” |
2 | “香蕉” |
3 | “橙” |
4 | “梨” |
5 | “柠檬” |
6 | “酸橙” |
列字符串中的每个数字都[Person.Fruit]
映射到一条[Fruit.ID]
记录,我希望能够通过 EF访问List<Fruit>
我班级上的等价物。Person
是否可以配置实体框架(特别是 6,可能在OnModelCreating
方法中)以使用此列中的拆分和解析的 id 作为内存中的外键?我不打算更改数据库,我只想使用 linq 轻松读取它,但是在构造另一个表时无法访问它,我无法在类中手动进行。
我知道 EF Core 具有值转换机制,但我无法找到将单个值转换为基于外键的列表导航属性的示例。我不使用 Core 的原因是因为我已经在同一个项目中使用 EF6 来访问另一个数据库,我不确定我是否可以在同一个进程中同时使用这两者。
我想在第一次访问数据库时可以构建额外的 many<->many 映射表,只要它不改变其他表的结构,因为它们正在被另一个黑盒库使用。
我愿意接受任何关于如何在修改数据库或不修改数据库或 EF Core 的情况下使用 EF6 的建议,只要可以避免现有 EF6 实现的问题,它不会破坏现有的数据库结构,我可以从 C# 中完成所有操作。
万一它有帮助,数据库是 SQLite,它已经很有趣了。
干杯。
解决方案
您可以为该表添加一个部分类到您的项目中,其中包括一个属性
public partial class Person
{
public List<int> FruitIds => this.Fruit.Split(';').Select(int.Parse).ToList();
}
但是您只能在代码中的物化数据中使用它,而不能在数据库语句中使用它来自动包含或选择事物。
如果您无法更改损坏的数据库,那么您将无能为力。
推荐阅读
- aem - AEM Dispatcher on IIS 10 with Windows Authentication NTLM - authentication problem when Dispatcher cache enabled
- javascript - Using responsebody in Postman re-usable test
- python - No print message from socket server, reciving response from client sent message
- javascript - How PouchDB conflicts occures?
- dc.js - dc.js grouped bar chart
- windbg - 弄清楚为什么 WinDBG 处于“忙”状态?
- operating-system - 将虚拟地址(逻辑地址)映射到物理地址
- python - 无法使用 _set | 查询外键相关对象 姜戈?
- javascript - 如何设置数据是否清除 onChange 函数不执行
- node.js - 使用 @kubernetes/client-node 修补 K8s 自定义资源