【发布时间】:2020-05-19 05:10:11
【问题描述】:
我有一个可用的 .NET Core 2.2 项目,我刚刚升级到 .NET Core 3.1
EntityFrameworkCore 发生了一些奇怪的事情,我不知道从哪里开始
我有以下(简化的)模型:
public class Asset()
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid Id { get; set; }
public Guid MainImageId{ get; set; }
public Image MainImage { get; set; }
public ICollection<Image> Images { get; set; }
}
public class Image()
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid Id { get; set; }
public Guid AssetId { get; set; }
public Asset Asset { get; set; }
}
所以一个资产有 1 个 MainImage。
这在我的模型中是这样定义的:
modelBuilder.Entity<Image>().HasOne(x => x.Asset).WithMany(x => x.Images).OnDelete(DeleteBehavior.Restrict);
这确实有效,直到我升级。现在,每次在 Assets 表上发生 SELECT 时,它都会尝试选择不存在的列 MainImageId1。
如果我尝试 AddMigration 我看到 EF Core 将添加一个名为 MainImageId1 的列并将一个外键放置到 Images 表中。
我已尝试将正确的列名称添加到此属性,但这也不起作用:
modelBuilder.Entity<Asset>().Property(x => x.MainImageId).HasColumnName("MainImageId");
有人知道如何进一步调试吗?我的 DbContext 类可能有问题吗?
【问题讨论】:
-
Core 版本变更时需要更新映射文件(模型)。 Core 对象中的地址随版本而变化。
-
感谢您的评论,您有这方面的文档吗?我正在尝试查找与此相关的内容,包括阅读此处列出的所有重大更改docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/…,但还没有运气
-
您需要刷新模型。请参阅:stackoverflow.com/questions/38739950/…
-
我不是先使用数据库,而是先使用代码,所以我不能像那样刷新模型。我模型中的所有代码都是手写的;
-
数据库可以是文件或服务器。文件中的输入数据是一个数据库。该模型必须由实体学习才能使用。模型已编译,因此编译器中的设置可能无法识别新模型(或编译模型)。用记事本打开 csproj,看看在哪里引用了模式。
标签: c# .net entity-framework