微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实体框架 6 可以从分隔的字符串列映射外键吗?

如何解决实体框架 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 "lime"

[Person.Fruit] 列字符串中的每个数字都映射到一个 [Fruit.ID] 记录,我希望能够在我的 List<Fruit> 类中访问等效的 Person通过EF。

是否可以配置实体框架(特别是 6,可能在 OnModelCreating 方法中)使用此列中拆分和解析的 id 作为内存中的外键?我不打算更改数据库,我只是想使用 linq 轻松读取它,但是在构建时无法访问其他表,我无法在类中手动执行。

我知道 EF Core 有一个值转换机制,但我找不到一个示例,它将单个值转换为基于外键的列表导航属性。我没有使用Core的原因是因为我已经在同一个项目中使用EF6来访问另一个数据库,我不确定是否可以在同一个进程中使用两者。

我想有可能在第一次访问数据库时构建额外的 manymany 映射表,只要它不改变其他表的结构,因为它们被另一个黑盒使用图书馆。

我愿意接受关于如何使用 EF6 修改数据库或 EF Core 的任何建议,只要可以避免现有 EF6 实现的问题,它不会破坏现有数据库结构,我可以用 C# 做到这一切。

如果有帮助,数据库sqlite,它已经很有趣了。

干杯。

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。