Базовые типы с помощью EntityFramework CodeOnly - PullRequest
1 голос
/ 15 октября 2010

У меня много проблем с «базовыми типами» в модели «Только код» Entity Framework. У меня много проблем с «базовыми типами» в модели Entity Framework «Только код».

Когда я пытаюсь запустить этот код, используя DbContext с DbSet<Template>, я получаю следующую ошибку.

A Свойство навигации «Флаги» сопоставлено с двумя различными таблицами объединения «page.flags» и «template.flags». Может существовать только одно отображение свойства навигации

Что это говорит мне о том, что я не могу отобразить унаследованные свойства. Это довольно разрушительно для многих объектно-ориентированного дизайна кода. Есть ли известное лекарство? Я понимаю, что могу сделать Layout неабстрактным и иметь поддержку, но совершенно очевидно, что это не является целью модели предметной области. Абстрактный класс - это основа, а не хранимая модель.

Я хотел бы добавить, что если я добавлю IList<Flag> в класс Template, этот код запустится. Поле Id все еще работает, даже через наследование. Я не понимаю, почему это происходит. Может ли кто-нибудь просветить меня?

public abstract class Layout
{
    public virtual int Id
    {
        get;
        set;
    }

    public virtual IList<Flag> Flags
    {
        get;
        set;
    }
}

public class Template : Layout
{
    public virtual string Name
    {
        get;
        set;
    }
}

public class Page: Layout
{
}

public class LayoutConfiguration : EntityConfiguration<Layout>
{
    public LayoutConfiguration()
    {
        HasKey(u => u.Id);
        Property(u => u.Id).IsIdentity();

        MapHierarchy().Case<Page>(c => new
        {
            c.Id
        }).ToTable("Pages");

        MapHierarchy().Case<Template>(c => new
        {
            c.Id,
            c.Name
        }).ToTable("Templates");
    }
}
public class TemplateConfiguration : EntityConfiguration<Template>
{
    public TemplateConfiguration()
    {
        Property(o => o.Name).HasMaxLength(64).IsUnicode();

        HasMany(u => u.Flags).WithOptional()
            .Map("template.flags",
            (template, flag) => new {
                Template = template.Id,
                Flag = flag.Id
            });

        MapSingleType(c => new {
            c.Id,
            c.Name
        }).ToTable("templates");
    }
}

public class PageConfiguration : EntityConfiguration<Page>
{
    public PageConfiguration()
    {
        HasMany(c => c.Flags).WithOptional()
            .Map("page.flags",
            (page, flag) => new
            {
                Page = page.Id,
                Flag = flag.Id
            });
    }
}

1 Ответ

1 голос
/ 15 октября 2010

Когда вы используете базовый тип для вашего объекта Template, вы также должны смоделировать это наследование в отображении.Это означает, что вы должны написать конфигурацию для Layout, которая будет отображать Id и Flags, и конфигурацию для Template, которая будет отображать Name.Существует несколько подходов отображения наследования в EF.Вы, вероятно, должны проверить Таблица в Hiearchy .

Редактировать: На основании вашего комментария вы ищете Таблица для класса + примеры для CTP4 .

Редактировать2: Хорошо.Я протестировал ваш сценарий со свойством навигации, определенным в абстрактном родительском классе, и оно действительно не работает, если вы пытаетесь сопоставить его с несколькими таблицами.

...