我最近使用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本身的查询结果:
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);
编辑:
通过修复现有的继承问题解决了这个问题。
答案 0 :(得分:1)
您没有指定关系的外键列名。它应该是:
this.HasMany(t => t.Kernwoorden)
.WithRequired(t => t.Element)
.Map(m => m.MapKey("ElementCode")); // FK column name in Kernwoorden table
或者,如果ElementCode
类中有外键属性 Kernwoorden
:
this.HasMany(t => t.Kernwoorden)
.WithRequired(t => t.Element)
.HasForeignKey(t => t.ElementCode);
答案 1 :(得分:0)
对于类型有一个共识。
例如,如果您有一位客户并且该客户只有一个Adress,并且Adress有一个邮政编码。
然后它将生成一个表Customer,其中包含字段Adress_Postcode。
在您的情况下,您的类名和表名不同,因此它将类型元素放入表Elementen。