【发布时间】: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