У меня много проблем с «базовыми типами» в модели «Только код» 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
});
}
}