3

Я новичок в EF и в соответствии с этим tutorial я настроил мой код-первых классов, чтобы иметь базу вызовов TableA's ID в качестве первичного и внешнего ключа для TableB, как показано ниже:Entity Framework Наследование Code First

[Table("TableA")] 
public abstract class TableA 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 
    public string Description { get; set; } 
} 

[Table("TableB")] 
public class TableB: TableA 
{ 
    [Key] 
    public int ID { get; set; }   
    public int Width { get; set; } 
} 

В контроллере при выполнении запроса:

var a = db.TableB.ToList(); 

Я получаю 0 для идентификаторов tableB. Но во время отладки я вижу базовый класс с соответствующими идентификаторами. поэтому я сделал цикл и внутри него назначил идентификаторы, используя item.ID = ((TableA)(item)).ID;.

Вышеупомянутые работы, как и в нем, присваивают идентификаторы, чтобы я мог видеть их на мой взгляд, но это правильный способ сделать это? Есть ли другие решения?

EDIT: Вот DbContext:

public class Context : DbContext 
    { 
     public ProductContext() 
      : base("DefaultConnection") 
     { 
     } 

     public DbSet<TableA> TableA { get; set; } 

     public DbSet<TableB> TableB { get; set; } 
    } 
+0

Можете ли вы показать свою DbContext? –

+0

@WouterdeKort, пожалуйста, см. Мое редактирование – Zaki

ответ

5

Когда имеешь дело с наследованием в Entity Framework, вы должны получить доступ к сущности через их родителей DbSet. Это означает, что в вашем случае вы должны получить доступ к своим TableB объектам через TableA на своем DbContext. Свойство TableB должно быть удалено.

Если вы запросили бы на TableA, вы получили бы все сущности, которые наследуют от TableA (в вашем случае только TableB объектов, но их может быть больше). Если вы хотите отфильтровать до TableB сущностей вы можете использовать OfType метод, как это:

from b in context.TableA.OfType<TableB>() 
select b; 
+0

«Свойство TableB должно быть удалено». вы имеете в виду, что идентификатор должен быть удален из TableB, поскольку он наследует от TableA? – Zaki

+0

Да, свойство Id должно быть удалено, но также свойство TableB на вашем DbContext –

+0

+1, которое работает благодаря. получил вопрос, если вы не возражаете :) .. что, если бы у меня был TableC, который был получен из TableB с собственным собственным идентификатором, но TableB с внешним ключом в TableC мне нужно указать его в TableB? – Zaki

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