最近,我使用EF Reverse Engineer Code First将现有的数据库转换为代码。在大部分结果优化完成后,我开始编写测试。目前出现的错误是尝试访问名为“Element_ElementCode”的列,但是并不存在这样的列。
为了确认这一点,我在整个项目中进行了搜索,以避免意外地声明它。
Find all "Element_ElementCode", Subfolders, Find Results 1, Entire Solution, ""
Matching lines: 0 Matching files: 0 Total files searched: 120
确切的错误如下:
System.Data.SqlClient.SqlException: Invalid column name 'Element_ElementCode'.
无效的列名“Element_ElementCode”重复出现了10-15次,堆栈跟踪并没有提供任何线索。
当执行包含表达式以检索数据并对其执行某些断言的测试时,会发生此异常。
var doos = (dbContext.Elementen.Where(d => d.ElementCode == "DOOS9001")).FirstOrDefault();
这是 SQL Server 查询本身的结果:
![enter image description here](https://istack.dev59.com/1WsM2.webp)
Element
(在 Element.cs
中)具有以下字段:ElementCode
Doelgroep
Type
Omschrijving
Titel
元素被映射如下:
public class ElementenMap : EntityTypeConfiguration<Element> {
public ElementenMap() {
// Primary Key
this.HasKey(t => t.ElementCode);
// Properties
this.Property(t => t.ElementCode)
.IsRequired()
.HasMaxLength(255);
this.Property(t => t.Type)
.HasMaxLength(31);
this.Property(t => t.Doelgroep)
.HasMaxLength(255);
this.Property(t => t.Omschrijving)
.HasMaxLength(255);
this.Property(t => t.Titel)
.HasMaxLength(255);
// Table & Column Mappings
this.ToTable("Elementen");
this.Property(t => t.ElementCode).HasColumnName("ElementCode");
this.Property(t => t.Type).HasColumnName("Type");
this.Property(t => t.Doelgroep).HasColumnName("Doelgroep");
this.Property(t => t.Omschrijving).HasColumnName("Omschrijving");
this.Property(t => t.Titel).HasColumnName("Titel");
// Relationships
this.HasMany(t => t.Kernwoorden)
.WithRequired(t => t.Element)
.Map(m => m.ToTable("Kernwoorden"));
}
}
此外:我确定数据库被访问了,因为在同一数据库中不同表格的其他测试都成功了。
我试图提供尽可能多的相关信息,如果有遗漏,请告诉我。为什么它要访问名为“Element_ElementCode”的列?这是我忘记关闭的约定吗(我已经不得不关闭PluralizingTableNameConvention)?
我该从哪个方向寻找答案?
编辑:
Kernwoord.cs
public class Kernwoord {
public string ElementCode { get; set; }
public string KernwoordString { get; set; }
public virtual Element Element { get; set; }
}
Element.cs
public partial class Element {
public Element() {
this.LeertrajectElementen = new List<LeertrajectElement>();
this.Kernwoorden = new List<Kernwoord>();
}
public string ElementCode { get; set; }
public string Type { get; set; }
public string Doelgroep { get; set; }
public string Omschrijving { get; set; }
public string Titel { get; set; }
public virtual Casus Casus { get; set; }
public virtual Document Document { get; set; }
public virtual Doos Doos { get; set; }
public virtual ICollection<LeertrajectElement> LeertrajectElementen { get; set; }
public virtual StellingenSpel StellingenSpel { get; set; }
public virtual ICollection<Kernwoord> Kernwoorden { get; set; }
}
LeertrajectElementenMap.cs代码片段:
this.HasRequired(t => t.Element)
.WithMany(t => t.LeertrajectElementen)
.HasForeignKey(d => d.ElementCode);
编辑:
通过修复现有的继承问题,该问题已得到解决。
this.Property(t => t.ElementCode).HasColumnName("ElementCode");
和.Map(m => m.ToTable("Kernwoorden"));
。我建议放弃所有“手动”命名(它们都是相同的),并尝试不使用它。你在做太多了 - 你让EF感到困惑 :) - NSGaga-mostly-inactive