5

次のように定義された自己結合テーブルにマップするPOCOクラスがあります。

CREATE TABLE [dbo].[GalleryCategories](
    [CategoryID] [int] IDENTITY(0,1) NOT NULL PRIMARY KEY CLUSTERED,
    [Name] [nvarchar](256) NOT NULL,
    [ParentID] [int] NULL REFERENCES [dbo].[GalleryCategories] ([CategoryID]) ON DELETE NO ACTION ON UPDATE NO ACTION, 
)

モデルビルダーを使用して子から親を参照する関係を定義する方法があることを私は知っています...(たとえば、このように

しかし、私がマップしようとしているクラスは次のようになります...

public class GalleryCategory
{
    [Key]
    public int CategoryID { get; set; }
    public string Name { get; set; }
    public int? ParentID { get; set; }
    public List<Category> Subcategories { get; set; }
}

言い換えると、サブカテゴリにすべての子を設定しようとしています。つまり、階層を上ではなく、階層を下に移動します。

EFを使用してこれを行う方法はありますか?これはどこかのFAQであるに違いありませんが、1時間グーグルした後、私はそれを見つけることができませんでした:-)

4

1 に答える 1

12

それはあなたのクラスのリストサブカテゴリであるべきですか? その場合、それが自己参照テーブルである場合、次のようなデータ注釈のいずれかの方法でマッピングを作成できます。

 public class GalleryCategory
    {
        [Key]
        public int CategoryID { get; set; }
        public string Name { get; set; }
        public int? ParentID { get; set; }
        [ForeignKey("ParentID")]
        public virtual List<GalleryCategory> Subcategories { get; set; }
    }

または流暢にこのように:

 public class Model : DbContext
    {
        public DbSet<GalleryCategory> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<GalleryCategory>()
               .HasMany(x => x.Subcategories)
                .WithOptional()
                .HasForeignKey(g => g.ParentID);
        }
    }
于 2012-08-15T20:32:51.797 に答える