Я недавно преобразовал существующую базу данных в код с использованием EF Reverse Engineer Code First. После полировки большинства результатов я начал писать тесты. Ошибка, с которой я сейчас сталкиваюсь, пытается получить доступ к имени столбца под названием «Element_ElementCode», однако такой столбец не существует.
Чтобы убедиться в этом, я выполнил поиск по всему моему проекту, чтобы избежать возможности случайно объявить его как таковой.SQLException: Недопустимое имя столбца
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 раз, а StackTrace не дает никакой подсказки.
Это исключение возникает при выполнении теста, который содержит выражение для извлечения данных и выполнения некоторых утверждений на нем.
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)?
В каком направлении я должен искать это?
Edit:
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.ElementCode). HasColumnName ("ElementCode"); 'и' .Map (m => m.ToTable ("Kernwoorden")); '. Я бы посоветовал отказаться от всех «ручных» наименований (что все равно) и попробуйте их. вы делаете «слишком много» - вы сбиваете с толку EF :) – NSGaga
Без этого не имеет значения, но я скорректировал его на аналогичное (но все же не решение), как указано в комментариях ниже. Обратите внимание, что это автоматически генерируется EF, это не должно путать себя! –
было бы проще иметь полную модель, которую мы могли бы быстро протестировать – NSGaga