【问题标题】:EfCore 3.1 tries to add a column that already existsEfCore 3.1 尝试添加已存在的列
【发布时间】: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&lt;Asset&gt;().Property(x =&gt; 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


【解决方案1】:

我终于找到了答案。我错过了一个属性,这似乎是确保 Entity Framework 理解这种关系所必需的。

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; }

   //THIS WAS ADDED TO SOLVE THE PROBLEM:
   public ICollection<Asset> MainAssets {get;set;}
}

我将集合 MainAssets 添加到 Images 类,然后更新我的模型以包含以下两个映射:

modelBuilder.Entity<Image>()
    .HasOne(x => x.Asset)
    .WithMany(x => x.Images)
    .HasForeignKey(x => x.AssetId);

modelBuilder.Entity<Asset>()
    .HasOne(x => x.MainImage)
    .WithMany(x => x.MainAssets)
    .HasForeignKey(x => x.MainImageId);

现在一切都恢复正常了。似乎通过添加MainAssets 的集合是让实体框架更好地理解这种关系的关键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 2011-12-02
    • 2016-01-26
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多