Платформа сущностей с наследованием, условием и внешним ключом
-
18-09-2019 - |
Вопрос
Я только начал экспериментировать с Linq для сущностей и столкнулся с проблемой, которую не могу понять.
Я получаю эту ошибку:
Сопоставляется член условия «RelatedResources.TypeID» с условием, отличным от «IsNull=False».Либо удалите условие для ReleaseResources.TypeID, либо удалите его из сопоставления.
Существующее условие — это поле TypeID в абстрактной сущности связанного ресурса, которое определяет тип связанного ресурса (книга, ссылка, руководство и т. д.).TypeID также является внешним ключом и сопоставляется с сущностью типа ресурса.Я думаю, что это проблема, но я не знаю, как и почему я должен это изменить.
Решение
Обычно это происходит, когда у вас есть TypeID в качестве условия и вы также используете его как свойство.Это может вызывать проблемы, поскольку вы используете его для сопоставления ассоциации с ResourceType И используете его в качестве условия наследования.
Другие советы
Является RelatedResources.TypeID
установлено значение не равное нулю (т.'Isnull=false') в базе данных и в схеме сущности?
Не уверен, что вы можете использовать это поле как условное и действовать как внешний ключ для другой таблицы.
И понадобится ли это вам, если вы используете условное наследование для определения типа?
Похоже на ошибку наследования таблицы на иерархию (TPH):
Использовать [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));
}
}