У меня есть пара проблем с EF 4.2 и текущими API с подходом к проектированию Code First и наследованием свойств базового класса (Table Per Concrete Type) ...
1) Fluent Api для игнорирования свойства базового класса(не примитивное свойство) вызывает ошибку EF.
Похоже, что мои операторы игнорирования в свободном API не обрабатываются должным образом в моем свойстве базового класса.
class BaseContentElement {
public virtual BaseContentElemnt Parent {get; set;}
public int Id {get;set;}
...
}
class ChapterElement : BaseContentElement {
public virtual CourseElement Course {
get { return base.Parent as CourseElement; } set {base.Parent = value; }
}
...
}
В свободном API,оператор
var config = new EntityTypeConfiguration<ChapterElement>();
config.Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Chapter", Schema);
});
config.HasKet( ch => ch.Id );
config.Ignore( ch => ch.Parent );
заставляет EF генерировать ошибку, что 'Id' не найден в классе ChapterElement
...
Если, однако, я добавляю аннотацию данных [NotMapped]в свойстве Parent класса BaseContentElement
механизм EF работает, и создается БД ...
2) Свойство ассоциации базового класса с таблицей поиска приводит к ошибкам при вставке дубликата ключа ...
public abstract class BaseListItemElement : BaseContentElement, IComparable
{
public int Id { get; set; }
public int Index { get; set; }
public virtual StaticContentBlockElement Item { get; set; }
public virtual eAnimationDirection AnimeDirectionEnum
{
get
{
if (AnimeDirection != null)
{
return AnimeDirection.EnumValue;
}
return eAnimationDirection.None;
}
set
{
AnimeDirection = AnimationDirection.Lookup[value];
}
}
public virtual AnimationDirection AnimeDirection { get; set; }
...
public class TextListItem : BaseListItemElement {
...
}
В моем приложении я храню таблицу поиска в памяти всех значений таблицы поиска (приложение работает с перечислением eAnimationDirection
, и БД обновляется с помощьюAnimeDirection
свойство).Прежде чем добавить записи в DBContext
, я присоединяю значения поиска к контексту DbContext.AnimationDirections.Attach(
... для каждого элемента в таблице поиска ...).
Когда я добавляю объекты в БДЯ получаю повторяющуюся ошибку вставки в таблицу AnimationDirection
(которая является справочной таблицей) ..
Если, однако, я перемещаю свойства, AnimeDIrection
и AnimeDirectionEnum
в подкласс, TextListItemElement
, операции завершаются без ошибок ... У меня есть 3 других подкласса, которые также имеют общие свойства (на самом деле есть два свойства поиска для базового класса, которые я разделяю, поэтому было бы нецелесообразно перемещать свойства в подклассклассы) ...
Либо это ошибка в EF 4.2, либо это может быть связано с тем, что мой базовый класс является абстрактным (у Microsoft плохая история с базовыми абстрактными классами ....)