目前使用 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?因为它不兼容。为此关系配置一个主键或一组具有兼容类型的外键属性。
有没有办法遵循这些说明(配置主键或一组具有兼容类型的外键属性)而不修改表的架构?如果没有,有没有办法设置导航属性?也许通过类上的一个属性,允许数据库具有一种数据类型,而数据模型具有另一种数据类型?或者我是否可能做错了超出数据类型问题的事情?
Widget 的数据类型为“int (10) unsigned”,数据类型为“int (11) Nullable”
根据MySQL文档关于外键(强调我的):
外键和引用键中对应的列必须具有相似的数据类型。 固定精度类型(例如 INTEGER 和 DECIMAL )的大小 和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。
这意味着一般情况下您无法在这两列上定义 FK,更不用说使用 EF 了。请注意,您的代码(如果有效)应该创建一个 FK,这是一个方案修改。
您需要调整数据库中的类型(代码优先或数据库优先,取决于您的情况和目标)然后您才能添加此关系。
在那之前,您必须手动连接和/或其他解决方法(视图等)