3

我最近使用 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)?

我应该寻找什么方向?

编辑:

克恩伍德.cs

public class Kernwoord {
        public string ElementCode { get; set; }

        public string KernwoordString { get; set; }

        public virtual Element Element { get; set; }
    }

元素.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);

编辑:

通过修复现有的继承问题解决了该问题。

4

2 回答 2

2

您没有指定关系的外键列名称。它应该是:

this.HasMany(t => t.Kernwoorden)
    .WithRequired(t => t.Element)
    .Map(m => m.MapKey("ElementCode")); // FK column name in Kernwoorden table

或者,如果您在类中有外键属性ElementCodeKernwoorden

this.HasMany(t => t.Kernwoorden)
    .WithRequired(t => t.Element)
    .HasForeignKey(t => t.ElementCode);
于 2013-03-31T19:34:48.347 回答
0

关于类型有一个约定。

例如,如果您有一个客户,而该客户只有一个地址,并且该地址有一个邮政编码。

然后它将生成一个带有字段 Adress_Postcode 的表 Customer。

在您的情况下,您的类名和表名不同,因此它将元素类型放入表 Elementen。

于 2013-03-31T19:26:53.840 回答