当索引和外键是不同的数据类型时,如何设置导航属性?

问题描述 投票:0回答:1

目前使用 EF Core 6。如果重要的话,我正在使用 MySql 数据库。

我有几个数据库模型,它们是根据当前生产环境中现有的遗留数据库自动生成的。我的任务是将这些数据从旧数据库导入到新的数据库模式中。因为这是在生产中,所以我无法为了我要问的问题而修改数据库的架构。

该数据库有相关表。我们将它们称为 Widget 和 WidgetBlocker。 Widget 有一个 uint 类型的主键,与 WidgetBlocker 是多对多的关系。 WidgetBlocker 有一个返回 Widget 的外键,但数据类型(出于我不知道的原因)是 nullable int。这意味着我的课程看起来像这样......

public class Widget
{
   public uint WidgetId { get; set; }
.
.
.
}

public class WidgetBlocker
{
   public uint WidgetBlockerId { get; set; }
   public int? WidgetId { get; set; }
.
.
.

}

我想向 Widget 添加一个导航属性,如下所示:

public ICollection<WidgetBlocker> Blockers { get; set; }

然后我会像这样设置 DbContext OnModelCreating:

modelBuilder.Entity<Widget>(entity =>
{
   entity.HasMany(widget => widget.Blockers).WithMany().HasForeignKey(widgetBlocker => widgetBlocker.WidgetId);
});

代码构建得很好,但我收到运行时错误:

...与外键属性 int 的关系?无法定位主键 uint?因为它不兼容。为此关系配置一个主键或一组具有兼容类型的外键属性。

有没有办法遵循这些说明(配置主键或一组具有兼容类型的外键属性)而不修改表的架构?如果没有,有没有办法设置导航属性?也许通过类上的一个属性,允许数据库具有一种数据类型,而数据模型具有另一种数据类型?或者我是否可能做错了超出数据类型问题的事情?

c# entity-framework entity-framework-core
1个回答
0
投票

Widget 的数据类型为“int (10) unsigned”,数据类型为“int (11) Nullable”

根据MySQL文档关于外键(强调我的):

外键和引用键中对应的列必须具有相似的数据类型。 固定精度类型(例如 INTEGER 和 DECIMAL )的大小 和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

这意味着一般情况下您无法在这两列上定义 FK,更不用说使用 EF 了。请注意,您的代码(如果有效)应该创建一个 FK,这是一个方案修改。

您需要调整数据库中的类型(代码优先或数据库优先,取决于您的情况和目标)然后您才能添加此关系。

在那之前,您必须手动连接和/或其他解决方法(视图等)

© www.soinside.com 2019 - 2024. All rights reserved.