Структура сущности с наследованием, условием и внешним ключом - PullRequest
11 голосов
/ 04 февраля 2010

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

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

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

Существующим условием является поле TypeID в абстрактном объекте RelatedResource, которое определяет тип RelatedResource (книга, ссылка, руководство и т. Д.) TypeID также является внешним ключом и отображается в ассоциации с сущностью Resource Type. Я думаю, что это проблема, но я не знаю, как и почему я должен изменить это.

Ответы [ 3 ]

9 голосов
/ 04 февраля 2010

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

0 голосов
/ 02 июля 2017

Похоже на ошибку наследования таблицы на иерархию (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));
    }
}
0 голосов
/ 04 февраля 2010

Установлено ли значение RelatedResources.TypeID не равным нулю (т. Е. 'Isnull = false') в базе данных и в схеме Entryframework?

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

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

...