Я наткнулся на странную проблему в EF. В моей модели EF есть следующая иерархия классов
public abstract class Entity
{
[Column]
public string Id { get; set; }
[Association("Links", "Id", "SourceId", IsForeignKey = false)]
public List<EntityRelation> Relations { get; set; }
}
public class A : Entity
{
}
public class B : Entity
{
}
public class EntityRelation
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public long Id { get; set; }
[Column]
public int SourceId { get; set; }
[Column]
public int TargetId { get; set; }
[Column]
public RelationType RelationType { get; set; }
}
Где A и B - конкретные классы, сопоставленные с таблицами, а класс EntityRelation сопоставлен с таблицей, которая содержит логические отношения между строками в любой из таблиц A и B.
Странная проблема возникает, когда я пытаюсь вставить строки в таблицу Links - оператор INSERT, созданный EF, выглядит так:
INSERT INTO Links (SourceId, TargetId, RelationType, **A_Id**, **B_Id**)
VALUES (...)
По какой-то причине EF сгенерировал оператор INSERT, который объединен со столбцами A_Id, B_Id для каждого производного типа.
Конечно, команда INSERT не работает за следующим исключением:
System.Data.SqlClient.SqlException: Invalid column name 'A_Id'. Invalid column name 'B_Id'
Как мне этого избежать?
@ingvar У меня есть таблица для каждой сущности в БД. Я не использовал свободный API для определения отношения, а использовал атрибут Association.
Я имею в виду, есть ли таблица для типа Entity или у вас есть таблицы только для конкретных типов?
@ingvar на конкретный тип. Не для базовой сущности.





A and B are concrete classes mapped to tables- у вас есть таблица для объекта в db или только таблицы для этих классов? Также вы не использовалиRelationsвEntity, где он был нацелен. вы используете свободный API?