2013-03-31 4 views
1

Я недавно преобразовал существующую базу данных в код с использованием 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: enter image description here

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); 

РЕДАКТИРОВАТЬ:

Проблема была решена путем фиксации существующих проблем наследования.

+0

Почему вы карту 'this.Property (т => t.ElementCode). HasColumnName ("ElementCode"); 'и' .Map (m => m.ToTable ("Kernwoorden")); '. Я бы посоветовал отказаться от всех «ручных» наименований (что все равно) и попробуйте их. вы делаете «слишком много» - вы сбиваете с толку EF :) – NSGaga

+0

Без этого не имеет значения, но я скорректировал его на аналогичное (но все же не решение), как указано в комментариях ниже. Обратите внимание, что это автоматически генерируется EF, это не должно путать себя! –

+0

было бы проще иметь полную модель, которую мы могли бы быстро протестировать – NSGaga

ответ

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); 
+0

Это не сделало разница. Вы уверены, что здесь я должен заглянуть? Таблица «Kernwoorden» состоит только из столбца «ElementCode» и «Kernwoord», и когда я смотрю на диаграмму базы данных, я вижу, что они связаны вместе с FK на «ElementCode». –

+0

@JeroenVannevel: Ну, где-то вы должны сказать EF, что 'ElementCode' в таблице Kernwoorden ** является ** FK, иначе он будет принимать имя столбца FK по соглашению, которое является« NavigationPropertyNameInDependent + underscore + PKNameInPrincipial », которое было бы 'Element_ElementCode', если у вас есть свойство навигации' Element' в классе 'Kernvoorden'. Возможно, это поможет, если вы сможете показать класс «Kernvoorden» и «Element» с их ключевыми и навигационными свойствами. – Slauma

+0

Я отредактировал мое сообщение с запрошенной информацией. Обратите внимание, что, поскольку я в процессе редактирования кода, сгенерированного EF Code First, все еще есть некоторые проблемы, которые необходимо решить. По какой-то причине EF переводил каждую ссылку в класс 'Element' как свойство связанным классам. Сам элемент «Элемент» должен быть абстрактным классом и содержать несколько свойств. Другие классы наследуют от этого и добавляют свои собственные свойства. В настоящее время все они переведены как имеющие свойство «Элемент». Вы считаете, что это может быть проблемой? –

0

Существует оговорка относительно типов.

Например, если у вас есть клиент, и у этого клиента есть один и только один адрес, а адрес имеет почтовый индекс.

Затем он сгенерирует таблицу Customer с полем Adress_Postcode.

В вашем случае имя вашего класса и имя таблицы разные, поэтому он помещает элемент типа в элемент Elementen.

+0

Вы случайно не знаете, какое соглашение я должен отключить для этого? –

+0

Попробуйте переименовать свой класс так же, как и ваш стол. –

+0

Я прибегу к этому, если нет другого варианта (который удивит меня, если честно) –

Смежные вопросы