Несколько проблем с EF 4.2 и унаследованными свойствами ассоциации классов - PullRequest
1 голос
/ 14 января 2012

У меня есть пара проблем с 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 плохая история с базовыми абстрактными классами ....)

1 Ответ

0 голосов
/ 14 января 2012

Эти два вопроса совершенно не связаны, поэтому их не следует задавать вместе.Вторые вопросы следует задавать отдельно вместе с примером кода, показывающим, как вы присоединяете / добавляете сущности, потому что отсутствует значительная часть проблемы, а ваше описание действительно не дает ясности - реальный воспроизводимый код делает.Ответ на первый вопрос: это невозможно.После сопоставления любой части базового класса вы не можете игнорировать ее в производном классе.Производный класс должен содержать все свойства, сопоставленные с базовым классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...