Entity Framework のコード オンリー モデルの「基本型」に多くの問題があります。Entity Framework のコード オンリー モデルの「基本型」に多くの問題があります。
と を使用してこのコードを実行しようとするDbContext
とDbSet<Template>
、次のエラーが発生します。
A ナビゲーション プロパティ 'Flags' は、2 つの異なる結合テーブル 'page.flags' と 'template.flags' にマップされます。ナビゲーション プロパティのマッピングは 1 つだけ存在できます
これが私に言っているのは、継承されたプロパティをマップできないということです。これは、多くのオブジェクト指向コード設計にとって非常に破壊的です。既知の治療法はありますか?レイアウトを非抽象化して、それを裏付けることができることは理解していますが、これがドメイン モデルの意図ではないことは明らかです。抽象クラスは、格納されたモデルではなく、基本的なベースです。
追加したいのですが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
});
}
}