【问题标题】:EF Core 3.1 database first removed relation errorEF Core 3.1 数据库首次删除关系错误
【发布时间】:2022-01-11 20:55:07
【问题描述】:

有一个表 (tblCalculation),其中包含两个相关表(tblAddon 和 tblVehicle),外键 AddonId 和 VehicleId。在我的 c# core 3.1 应用程序中搭建了上下文和模型。然后我不得不更改该表的关系并删除与 tblVehicle 表的关系,因此我删除了 SSMS 中的关系并删除了外键 VehicleId。在我的代码中做了同样的事情并删除了 Calculation 模型上的属性 VehicleId 并从 OnModelCreating 设置中删除了 HasOne(..).WithMany(...) 定义。

但是当试图加载表时(通过这个过程它一直是空的)我得到无效的列名'VehicleId'。在 SSMS 中加载(仍然为空)表可以正常工作,但此代码会生成错误:

var calculations = await _context.Calculation.ToListAsync();

我缺少 ef 中的一些参考还是有什么问题?

编辑: 再次运行 Scaffold-DbContext 并找不到对 VehicleId 的任何引用

public partial class Calculation
{
    public int Id { get; set; }
    public int? AddonId { get; set; }
    public byte Period { get; set; }
    public short Mileage { get; set; }
    public decimal? ResidualValue { get; set; }
    public decimal? MonthlyCost { get; set; }
    public DateTime Created { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? Updated { get; set; }
    public string UpdatedBy { get; set; }

    public virtual Addon Addon { get; set; }
}

modelBuilder.Entity<Calculation>(entity =>
        {
            entity.Property(e => e.Created)
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.CreatedBy).HasMaxLength(50);

            entity.Property(e => e.MonthlyCost).HasColumnType("money");

            entity.Property(e => e.ResidualValue).HasColumnType("money");

            entity.Property(e => e.Updated).HasColumnType("datetime");

            entity.Property(e => e.UpdatedBy).HasMaxLength(50);

            entity.HasOne(d => d.Addon)
                .WithMany(p => p.Calculation)
                .HasForeignKey(d => d.AddonId)
                .HasConstraintName("FK_tblCalculation_tblAddon");
        });

将当前上下文的模型替换为临时模型会产生相同的问题,但在临时上下文中运行相同的模型是可行的。因此上下文中的某些内容保留了对 VehicleId 的引用,但找不到它。因此将生成一个完全独立的上下文(因为原始上下文中还有其他表)并从中运行。

【问题讨论】:

  • 最简单的解决方法?再次将其放置到另一个文件夹并使用差异工具(推荐 BeyondCompare)查看差异。我认为,在某个被遗忘的地方会有一个 VehicleId 挥之不去。或者你可以再次使用脚手架并使用新的脚手架。如果您自定义 ent,请在部分类中进行,这样重新脚手架就不会覆盖您的所有更改。如果您定期进行 re-scaffing,EF Core Power Tools 将有很大帮助(我发现对于 beta/未发布的迭代来说,重复 re-scaff 比迁移更容易。尤其是当有重命名列和表等更改时)跨度>
  • @CaiusJard 如果你回答这个问题,我可以接受。你在我的编辑中看到在相同的上下文中运行相同的模型会产生错误,但在单独的上下文中运行似乎可以工作

标签: c# entity-framework-core ef-database-first


【解决方案1】:

最简单的解决方案是再次搭建数据库。这应该为您提供一个工作环境,您可以将其用作您拥有的环境的完全替代品。如果您在现有上下文中自定义了模型,则需要将更改复制过来。使用 BeyondCompare 之类的工具可以使这变得更容易;将您的数据库搭建到与现有上下文所在的文件夹不同的新文件夹中,然后(这些是 BeyondCompare 特定说明)在 Windows 资源管理器中右键单击新文件夹并选择“选择左侧文件夹进行比较”,然后转到现有上下文所在的文件夹,然后右键单击,选择“与其他文件夹比较”。出现一个并排的窗口对,按 Ctrl A 并从其中一个菜单中选择比较内容(我忘记了,可能是会话或操作)。 BC 将比较所有文件,并以红色显示任何与 DM 有显着差异的文件。双击红色文件以查看并排差异并使用箭头从旧文件复制到新文件,或使用它来查找旧上下文中仍然提到 VehicleId 的任何挥之不去的文件(它可能在相关的相关文件中,除了你在问题中关注的那些)

将一个或另一个上下文作为主要上下文后,删除另一个上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2019-11-17
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多