Платформа сущностей с наследованием, условием и внешним ключом

StackOverflow https://stackoverflow.com/questions/2200906

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Похоже на ошибку наследования таблицы на иерархию (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- приложение-asp-net-mvc

Использовать [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));
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top