1

Entity Framework のコード オンリー モデルの「基本型」に多くの問題があります。Entity Framework のコード オンリー モデルの「基本型」に多くの問題があります。

と を使用してこのコードを実行しようとするDbContextDbSet<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
            });
    }
}
4

1 に答える 1

1

テンプレートエンティティに基本タイプを使用する場合は、マッピングでこの継承をモデル化する必要もあります。これは、IDとフラグをマップするレイアウトの構成と、名前をマップするテンプレートの構成を作成する必要があることを意味します。EFで継承をマッピングする方法はいくつかあります。おそらく、Hiearchyごとのテーブルを確認する必要があります。

編集:あなたのコメントに基づいて、クラスごとのテーブルとCTP4の例を探しています。

Edit2:わかりました。抽象親クラスで定義されたナビゲーションプロパティを使用してシナリオをテストしましたが、複数のテーブルにマップしようとすると実際には機能しません。

于 2010-10-14T20:14:48.617 に答える