首页 > 解决方案 > 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,它已经很有趣了。

干杯。

标签: c#sqliteentity-frameworkentity-framework-6foreign-keys

解决方案


您可以为该表添加一个部分类到您的项目中,其中包括一个属性

public partial class Person
{
     public List<int> FruitIds => this.Fruit.Split(';').Select(int.Parse).ToList();
}

但是您只能在代码中的物化数据中使用它,而不能在数据库语句中使用它来自动包含或选择事物。

如果您无法更改损坏的数据库,那么您将无能为力。


推荐阅读