有一个表(tblCalculation(,它有两个相关的表(tbl Addon和tbl Vehicle(,带有外键AddonId和VehicleId。在我的c#core3.1应用程序中构建了上下文和模型。然后,我必须更改该表的关系,并删除与tblVehicle表的关系。因此,我删除了SSMS中的关系,删除了外键VehicleId。在我的代码中做了同样的操作,删除了Calculation模型上的属性VehicleId,并从OnModelCreating设置中删除了HasOne(..(.WithMany(…(定义。
但是当试图加载表(在这个过程中一直为空(时,我得到了无效的列名"VehicleId"。在SSMS中加载(仍然是空的"表工作正常,但此代码生成错误:
var calculations = await _context.Calculation.ToListAsync();
我是否缺少参考资料,或者问题出在哪里?
编辑:再次运行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这样的工具可以更容易地做到这一点;将您的数据库脚手架到一个新的、与现有上下文所在的文件夹不同的文件夹中,然后(这些是BeyondCompare的特定说明(在windows资源管理器中右键单击新文件夹并选择";选择左文件夹进行比较";,然后转到现有上下文所在的文件夹并右键单击,选择";"与其他文件夹比较";。出现一对并排的窗口,按Ctrl A并从其中一个菜单中选择"比较内容"(我忘记了是哪一个,可能是"会话"还是"操作"(。BC将比较所有文件,并以红色显示任何与DM有显著差异的文件。双击红色文件以查看并排的差异,并使用箭头从旧文件复制到新文件,或者使用它在旧上下文中查找仍提到VehicleId的任何延迟文件(它可能在依赖相关文件中,而不是您在问题中关注的文件(
一旦你把一个或另一个上下文作为你的主要上下文,就删除另一个语境。