2016-07-25 3 views
0

у меня есть две моделиEF-код первого 1: * 1: 0..1 отношения между теми же моделями

public class A{ 
    public AID { get; set; } 

    public int? MainBID { get; set; } 
    [ForeignKey("MainBID")] 
    public B MainB { get; set; } 
} 
public class B{ 
    public int BID { get; set; } 

    public int? AID { get; set; } 
    [ForeignKey("AID")] 
    public virtual A Owner { get; set;} 
} 

Отношения Я хочу, чтобы смоделировать это А имеет много B. А может также иметь специально обозначенный B (основной B).

Однако путь она у меня настроить это имеет трудное время определения основного и с помощью свободно:

modelBuilder 
    .Entity<A>() 
    .HasOptional(x => x.MainB) 
    .WithOptionalDependent(); 

Это дает мне Множественность не действует в роли «A_MainB_Source» в отношениях «A_MainB». Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница множественности зависимой роли должна быть «*».

Я думаю, что моя проблема пытается описать EF, что это два отдельных отношения, а не одно и то же отношение, описанное спереди и назад. Может ли кто-нибудь вести меня в этом?

EDIT: Добавляет реальный пример

Я должен моделировать ряд учебных курсов (каждый называется «модуль»). Все «Модули» представляют собой веб-страницу, передающую информацию для этого конкретного курса. Каждый модуль может иметь множество «ресурсов» (загружаемых двоичных файлов).

Некоторые модули могут иметь Ресурс, который представляет ту же информацию, что и веб-страница. Как и в некоторых модулях, может быть ресурс, который можно распечатать и использовать вместо того, чтобы сидеть перед вашей машиной, просматривая веб-страницу. PDF-версия веб-страницы.

Итак, в приведенном выше описании каждый модуль имеет много ресурсов. Но каждый модуль может дополнительно иметь «специальный» ресурс, который нужно вызывать отдельно, а также везде, где используются другие ресурсы.

Я считал, что у меня есть флаг в Ресурсе, чтобы указать, что ресурс особенный в некотором роде, но это позволит 0 .. *, что не то, что я хочу. Я думал, что это может быть чище. Но до сих пор мне не удалось заставить это работать с EF.

+0

Можете ли вы привести пример реальной жизни того, что вы пытаетесь сделать? (Я не могу понять отношения, A-> Многие B (ваша модель не выглядит так!) –

+0

@LucianBumb см. Редактирование, которое я добавил. –

ответ

0

это рабочий пример:

public class Module 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<Resource> Resources { get; set; } 
     public int? SpecialResourceId { get; set; } 
     public Resource SpecialResource { get; set; } 
    } 

    public class Resource 
    { 
     public int Id { get; set; } 
     public int? ModuleId { get; set; } 
     public Module Module { get; set; } 
     public virtual Module IsSpecialForModule { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
     public virtual DbSet<Module> Modules { get; set; } 
     public virtual DbSet<Resource> Resources { get; set; } 


     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Module>() 
       .HasMany(x=>x.Resources) 
       .WithOptional(x=>x.Module) 
       .HasForeignKey(x=>x.ModuleId) 
       .WillCascadeOnDelete(false); 

      modelBuilder.Entity<Resource>() 
       .HasOptional(x=>x.IsSpecialForModule) 
       .WithOptionalDependent(x=>x.SpecialResource) 
       .WillCascadeOnDelete(false); 
     } 
    } 

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

public class Resource 
    { 
     public int Id { get; set; } 
     public int? ModuleId { get; set; } 
     public Module Module { get; set; } 
     public virtual ICollection<Module> IsSpecialForModules { get; set; } 
    } 

и конфигурации. будет:

modelBuilder.Entity<Resources>() 
       .HasMany(x=>x.IsSpecialForModules) 
       .WithOptional(x=>x.SpecialResource) 
       .HasForeignKey(x=>x.SpecialResourceId) 
       .WillCascadeOnDelete(false); 
+0

Если ресурс может быть особенным для многих модулей, то вам также нужно иметь один для многих для resource-> modules –

+0

Это решение действительно интересно несколькими способами. Является ли свойство навигации «IsSpecialForModule» абсолютно необходимым? В моем примере специальный ресурс всегда будет особенным для этого конкретного модуля. –

+0

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

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