2016-12-09 2 views
0

Я пробовал несколько вещей перед тем, как приходить сюда, например, различные модели, аннотации, объявления в DbContext, различные свободно используемые API-интерфейсы, но я не могу понять, в чем проблема.Реляционные таблицы наследования Entity Framework

У меня есть запись YogaClass, но когда я перебираю подписки от человека, у меня есть подписка, но нет YogaClass (NULL) и да. Я включаю (Person.Subscriptions) при запросе БД, я получаю а не связанный с ним реляционный YogaClass/WorkShop.

Короче у меня есть следующие классы:

Подписка (базовый класс)

public class Subscribtion 
{ 
    [Key] 
    public int SubscribtionID { get; set; } 

    public Person Person { get; set; } 
    public bool IsPayed { get; set; } 
} 

WorkshopSubscription (inherrits Подписка)

public class WorkshopSubscribtion : Subscribtion 
{ 
    [Key] 
    public int WorkshopSubscribtionID { get; set; } 
    public Workshop Workshop { get; set; } 
} 

YogaClassSubscription (inherrits Подписка)

public class YogaClassSubscribtion : Subscribtion 
{ 
    [Key] 
    public int YogaClassSubscribtionID { get; set; } 
    public YogaClass YogaClass { get; set; } 
} 

YogaClass (базовый класс)

public class YogaClass 
{ 
    [Key] 
    public int YogaClassID { get; set; } 
    public List<Subscriptions> Subscriptions { get; set; } 
} 

WorkShop (базовый класс)

public class WorkShop 
{ 
    [Key] 
    public int WorkShopID { get; set; } 
    public List<Subscriptions> Subscriptions { get; set; } 
} 

Теперь после того, как я ввожу некоторые записи в Сеялка я следующие проблемы, когда я смотрю в моей базе данных:

Таблица Subscription: SubscriptionID: 1, WorkShop_WorkShopID: NULL, YogaClass_YogaClassID: NULL. (Почему они оба NULL?) enter image description here

Таблица YogaClassSubscription: SubscriptionId: 1, YogaClassID: 1 enter image description here же для мастерской.

Я не понимаю, почему FK от йоги & Подписка на подписку является NULL в таблице подписки.

У меня есть DbSet, объявленный в моем контексте и в методе API-интерфейса modelBuilder, я сопоставил YogaClassSubscribtion & WorkShopSubscribtion с их собственной таблицей.

public DbSet<Subscribtion> Subscribtions { get; set; }  
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<WorkshopSubscribtion>().ToTable("WorkshopSubscribtions"); 
    modelBuilder.Entity<YogaClassSubscribtion>().ToTable("YogaClassSubscribtions"); 
} 
+0

Почему это проще для публикации скриншотов, чем для копирования кода? – RandomStranger

+0

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

+0

Как вы видите, я не могу правильно отобразить весь код, и я делаю это точно так же ... Снова извините, но idk, как это происходит. –

ответ

1

Я думаю, ваша проблема связана с использованием базового класса Subscription как тип ваших общих списков Subscriptions. Вы должны использовать специальную производные классы YogaClassSubscription и WorkShopSubscription:

public class YogaClass 
{ 
    [Key] 
    public int YogaClassID { get; set; } 
    public virtual List<YogaClassSubscription> Subscriptions { get; set; } 
} 

public class WorkShop 
{ 
    [Key] 
    public int WorkShopID { get; set; } 
    public virtual List<WorkShopSubscription> Subscriptions { get; set; } 
} 

Этот способ EF знает об отношениях между WorkShops и WorkShopSubscriptions, а также между YogaClasses и YogaClassSubscriptions.

Другое, что кажется неправильным: переопределение свойства ID и аннотаций Key в ваших производных классах. Вам нужно только определить идентификатор в базовом классе. Удалите эти свойства и их аннотации. EF создаст внешний ключ с взаимно-однозначным отношением между таблицей базового класса и таблицами производных классов.

public class WorkshopSubscription : Subscription 
{ 
    public virtual Workshop Workshop { get; set; } 
} 

public class YogaClassSubscription : Subscription 
{ 
    public virtual YogaClass YogaClass { get; set; } 
} 

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

+0

Спасибо, много о Diana, я довольно часто видел использование виртуальных свойств, но я не учился так, поэтому я действительно никогда не добирался до него, также меняясь со Списка , чтобы унаследованный тип работал, но im not Конечно, почему, почему у вас есть наследственность, если вы не можете использовать базовый класс как тип? Теперь у меня нет идентификатора YogaClass/Workshop в моей таблице Subscribtion, но есть правильный ссылочный идентификатор в обеих таблицах с наследуемыми классами. Еще раз спасибо! С уважением –

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