2

同じタイプの親をオプションで参照できるモデルを作成しようとしています。次に例を示します。

public class Category
{
    public virtual long CategoryID { get; set; }

    public virtual Category? ParentCategory { get; set; }

    public virtual int UserID { get; set; }
    public virtual string Name { get; set; }

}

ご覧のとおり、ParentCategoryというオプションのメンバーがあります。これはオプションで、Categoryタイプ(つまり同じタイプ)のクラスを参照します。ご想像のとおり、ルートノードに親がない単純なカテゴリツリーを作成しようとしています。

これにより、Entity Frameworkがデータベースを作成しようとすると、次のエラーが発生します。

"タイプ'MyProject.Models.Category'のプロパティ'ParentCategoryID'のForeignKeyAttributeが無効です。依存型'MyProject.Models.Category'でナビゲーションプロパティ'Category'が見つかりませんでした。Name値は有効なナビゲーションである必要がありますプロパティ名。"

私もこれを試しました:

public class Category
{
    public virtual long CategoryID { get; set; }

    [ForeignKey("Category")]
    public virtual long? ParentCategoryID { get; set; }

    public virtual int UserID { get; set; }
    public virtual string Name { get; set; }

}

しかし、これも同じエラーになりました。

EFコードファーストを使用してこれをモデル化することは可能ですか?データベースを手動で作成する場合は、データベースでモデル化するのは簡単です。

よろしくお願いしますベン

4

1 に答える 1

2

T?のショートカットはNullable<T>値型にしか適用できないため、最初の例はコンパイルさえしません。

以下はここでうまくいきます:

public class Category
{
    public virtual long CategoryID { get; set; }
    public virtual Category ParentCategory { get; set; }
}

これで、デフォルトで FK に醜い名前が使用されますParentCategory_CategoryID

これは、より良い名前を取得する方法であり、使用する際の柔軟性に加えて、次のようになります。

public class Category
{
    public virtual long CategoryID { get; set; }
    [ForeignKey("ParentCategoryID")]
    public virtual Category ParentCategory { get; set; }
    public virtual long? ParentCategoryID { get; set; }
}
于 2012-05-28T17:28:43.617 に答える