Как моделировать справочные таблицы с EF DbContext - PullRequest
4 голосов
/ 27 мая 2011

Я использую Entity Framwork DbContexts с устаревшей базой данных.У меня есть 2 разных свойства объекта, которые оба должны ссылаться на одну и ту же таблицу поиска, например:


public class Address
{
   public virtual AddressType AnAddressType {get; set;}
   public virtual AddressType AnotherAddressType {get; set;}
}

// now here's a LINQ query that just flat won't work:
from a in Addresses select a;


Исключение означает, что мы попытались включить в список выбора полностью вымышленное поле - полене отображается ни в моем POCO, ни в таблице - похоже, что это ожидалось по соглашению, он называется AnAddressType_AddressType или что-то похожее на

Сущность AddressType не имеет соответствующего свойства навигации.Я не могу заставить это работать.Когда я пытаюсь выбрать данные с помощью моего запроса LINQ, я получаю ошибки времени выполнения.

Редактировать

У меня есть другие отношения, которые работают (этот код генерируется из "сток "Генератор DbContext).Отличие этого единственного отношения в том, что таблица поиска не имеет свойства навигации к основной таблице (таблица поиска используется повсеместно, поэтому я не хочу добавлять свойства nav из нее ввсе что его использует).У EF, похоже, с этим проблемы.Вероятно, это проблема конфигурации и соглашения, и я случайно наткнулся на какую-то проблему соглашения.

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

У вас есть имя столбца внешнего ключа в устаревшей базе данных, которое не соответствует соглашениям EF, например: Столбец внешнего ключа в вашей таблице Addresses к таблице AddressTypes для отношения AnAddressType имеет имя MyCrazyAnAddressTypeNumberCodeKeyId.

Но EF будет считать, что имя столбца FK: [Nav.property]_[KeyColumn]. Например: если AddressType имеет PK с именем AddressTypeId EF будет предполагать, что столбец FK имеет имя AnAddressType_AddressTypeId. Поскольку это не соответствует, вы получаете исключение, которое вы описываете. Вы должны явно указать имя столбца FK для решения этой проблемы:

modelBuilder.Entity<Address>()
            .HasRequired(a => a.AnAddressType)
            .WithMany()
            .Map(c => c.MapKey("MyCrazyAnAddressTypeNumberCodeKeyId"))
            .WillCascadeOnDelete(false);

(фрагмент кода, частично украденный из ответа Ладислава для удобства)

Это моя гипотеза.

Редактировать

В качестве альтернативы вы можете ввести свойство внешнего ключа в вашу модель и сообщить EF посредством аннотаций данных, что это свойство является FK для соответствующего свойства навигации:

public class Address
{
   [ForeignKey("AnAddressType")]
   public int MyCrazyAnAddressTypeNumberCodeKeyId {get; set;}
   public virtual AddressType AnAddressType {get; set;}
}
2 голосов
/ 27 мая 2011

Если вам не нужны навигационные свойства по обе стороны отношения, вы должны помочь EF с плавным отображением, чтобы модель была представлена ​​правильно:

...