问题描述
我正在尝试从一个数据库中读取,不幸的是,该数据库旨在将外键存储在分隔字符串中,而不是单独的表中,而且我没有更改数据库结构的选项。举个例子:
表 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 | "lime" |
[Person.Fruit]
列字符串中的每个数字都映射到一个 [Fruit.ID]
记录,我希望能够在我的 List<Fruit>
类中访问等效的 Person
通过EF。
是否可以配置实体框架(特别是 6,可能在 OnModelCreating
方法中)使用此列中拆分和解析的 id 作为内存中的外键?我不打算更改数据库,我只是想使用 linq 轻松读取它,但是在构建时无法访问其他表,我无法在类中手动执行。
我知道 EF Core 有一个值转换机制,但我找不到一个示例,它将单个值转换为基于外键的列表导航属性。我没有使用Core的原因是因为我已经在同一个项目中使用EF6来访问另一个数据库,我不确定是否可以在同一个进程中使用两者。
我想有可能在第一次访问数据库时构建额外的 manymany 映射表,只要它不改变其他表的结构,因为它们被另一个黑盒使用图书馆。
我愿意接受关于如何使用 EF6 修改数据库或 EF Core 的任何建议,只要可以避免现有 EF6 实现的问题,它不会破坏现有数据库结构,我可以用 C# 做到这一切。
干杯。
解决方法
您可以为此表的项目添加一个部分类,其中包括一个属性
public partial class Person
{
public List<int> FruitIds => this.Fruit.Split(';').Select(int.Parse).ToList();
}
但是您只能在代码中的物化数据中使用它,而不能在数据库语句中使用它来自动包含或选择事物。
如果您无法更改损坏的数据库,那么您将无能为力。