9

Использование EF 5, код First.Как моделировать сущность структуры объекта/сопоставление только с односторонней навигацией

Я хотел бы моделировать мои объекты таким образом, чтобы свойства навигации существовали только с одной стороны отношения.

Так что, если у меня есть таблица виджетов и таблицы WidgetType:

public class Widget 
{ 
    public int Id { get; set; } 
    public int WidgetTypeId { get; set; } 
    public WidgetType WidgetType { get; set; } 
} 

public class WidgetType 
{ 
    public int Id { get; set; } 
    //note there is no collection of Widgets here 
} 

public class WidgetMap : EntityTypeConfiguration<Widget> 
{ 
    public WidgetMap() 
    { 
     HasKey(t => t.Id); 
     //totable, etc. 

     HasRequired(t => t.WidgetType); //what else is needed? 
    } 
} 

Я никогда не хочу, чтобы принести виджетов с точки зрения widgetType, так что имеет смысл (для меня во всяком случае), чтобы не иметь свойства навигации для объекта WidgetType.

Как заполнить код сопоставления, указанный в примере кода, без необходимости добавлять свойство в WidgetType? Это возможно?

+0

Имеет ли решение ** ** свободное владение? – mattytommo

+0

Я бы сказал, что это очень желательно. Я предпочел бы, чтобы свойства шли двумя способами, чем для того, чтобы они были белки. –

+0

Хорошо, вы пробовали 'HasRequired (t => t.WidgetType) .WithRequired();'? – mattytommo

ответ

8

По просьбе в комментариях, вот мой ответ.

Вы должны попробовать:

HasRequired(t => t.WidgetType).WithRequired().HasForeignKey(t => t.FKField); 
+1

Отредактировано для добавления внешнего ключа. Кажется, что это работает, хотя я * немного * обеспокоен тем, что EF делает какое-то условное сопоставление, поэтому совершенно невозможно, что он работает на основе условных обозначений и фактически игнорирует этот код. :) –

13

Я знаю, что есть ответ принят, но выше решение не работает для меня, и я должен был настроить его немного.

Я использую Entity Framework 6 и имел аналогичную проблему. У меня была таблица под названием BaseEntity, которая имела поле CreatedByID, которое указывало на мою таблицу UserAccount.

Это создало ICollection типа BaseEntity в моем классе UserAccount. Я был в состоянии решить эту проблему, используя следующий код в моем BaseEntity отображение:

this.HasOptional(t => t.UserAccount) 
    .WithMany() 
    .HasForeignKey(t => t.CreatedByID); 

Я был тогда в состоянии удалить коллекцию BaseEntity из класса UserAccount, который создал однонаправленный один-ко-многим отображение в EF6.

Запись UserAccount необязательна, поскольку UserAccount наследует от BaseEntity. Обязательно используйте HasRequired(), если это обязательный атрибут в вашей модели.

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

  • Нет связанных вопросов^_^