EF5 (4.4 .NET 4) «свойство навигации не объявлено» TPH - PullRequest
0 голосов
/ 09 октября 2018

Недавно мы перешли от наличия наших собственных пользовательских атрибутов для InverseProperty (EntityChildNavigationProperty) и ForeignKey (EntityForeignKeyProperty) к тому, чтобы наши пользовательские атрибуты наследовали от InverseProperty EntityFramework и ForeignKey, поскольку они выполняли одну и ту же задачу.Мы сохранили исходные свойства для обеспечения обратной совместимости, но сейчас сталкиваемся с этой проблемой.

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

Идея состоит в том, что у нас будет структура TPH, в которой базовый класс будет иметь все стандартные свойства (столбцы) и каждый из них.реализация компонента могла бы переопределять по мере необходимости или добавлять свои собственные свойства, но сохранять то же имя таблицы (ClassA и / или ClassB).

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

Структура ForeignKey / InverseProperty удовлетворяется в базовом классе,так почему производные классы вызывают проблему?Отличается ли он в EF5 (.net 4.5) или EF6?

public class BaseClassA
{
    [DataMember]
    [EntityChildNavigationProperty("BaseClassA")] //Custom Attribute for InverseProperty
    public virtual ICollection<BaseClassB> BaseClassBs { get; set; }
}

public class BaseClassB
{
    [DataMember]
    public virtual int? BcbBcaId { get; set; }

    [DataMember]
    [EntityForeignKeyProperty("BcbBcaId")] //Custom Attribute for ForeignKey
    public virtual BaseClassA BaseClassA { get; set; }
}

public class ClassA : BaseClassA
{
}

public class ClassB : BaseClassB
{
}

public class Context : DbContext
{
    public DbSet<ClassA> ClassAs { get; set; }
    public DbSet<ClassB> ClassBs { get; set; }
}
...