Структура объекта с наследованием, условием и внешним ключом

Я только начал играть с Linq для сущностей и столкнулся с проблемой, которую я не могу понять.

Я получаю эту ошибку:

Отображается элемент состояния "RelatedResources.TypeID" с условием, отличным от "IsNull = False". Либо удалите условие на RelatedResources.TypeID, либо удалите его из сопоставления.

Условие, которое существует, является полем TypeID в абстрактном объекте RelatedResource, который определяет тип RelatedResource (Book, Link, guide и т.д.). TypeID также является внешним ключом и отображается в ассоциации с объектом типа ресурса. Я думаю, что это проблема, но я не знаю, как и почему я должен изменить это.

Ответ 1

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

Ответ 2

Является ли RelatedResources.TypeID не равным нулю (например, "Isnull = false" ) в базе данных и в схеме сущ. схемы?

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

И вам нужно, если вы используете условное наследование для определения типа?

Ответ 3

Звучит как ошибка наследования на основе таблицы (TPH):

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

Используйте свойство [NotMapped] для свойства базового класса.

Псевдокод:

public abstract class MyBaseClass
{ 
    [NotMapped]
    public MyEnum MyEnum { get; protected set; }
}


public class DerivedOne: MyBaseClass
{
    public DerivedOne()
    {
        MyEnum = MyEnum.Value1;
    }

    public string MyDerivedOneString { get; set; }
}

public class DerivedTwo: MyBaseClass
{
    public DerivedTwo()
    {
        MyEnum = MyEnum.Value2;
    }
}

public class MyDbContext : DbContext
{
    DbSet<MyBaseClass> MyBaseClass { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<MyBaseClass>()
            .Map<DerivedOne>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value1))
            .Map<DerivedTwo>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value2));
    }
}