0

私は次のクラスを持っています:

public class Page : BaseModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PageID { get; set; }
    public int? ParentID { get; set; }
    public string Name { get; set; }

    public virtual Page Parent { get; set; }
    public virtual ICollection<Page> Children { get; set; }

    public IDictionary<int, string> PossibleParents
    {
        get
        {
            Dictionary<int, string> items = new Dictionary<int, string>();
            items.Add(-1, "Please Select");

            using (var context = new WebsiteContext())
            {
                var pages = context.Pages;
                foreach (var p in pages)
                    items.Add(p.PageID, p.Name);                    
            }

            return items;
        }
    }

    public Page()
    {
        this.Order = 0;
        this.Live = false; 
    }
}

public class CommodityPageMap : EntityTypeConfiguration<Page>
{
    public CommodityPageMap()
    {
        HasOptional(x => x.Parent)
            .WithMany(x => x.Children)
            .HasForeignKey(x => x.ParentID)
            .WillCascadeOnDelete(false);
    }
}

問題

ParentIDページを親ページにリンクするようにマップすると想定しました。ただし、データベースの更新時に EF が作成したようParent_PageIDです。設定ParentIDすると、関連付けが適切に作成されず、 null でParentsあるため要素が含まれていません。Parent_PageID

私が試してみました

削除するParentIDと、外部キーを設定するために必要なため、コンパイルされません。アクセス時に実行時にエラーが発生し、モデルに追加して無視するのはばかげているように見えるため、データ注釈[Column("Parent_PageID")]を追加できません。ParentIDPossibleParentsParent_PageIDParentID

私は何かが欠けていると思いますが、助けていただければ幸いです。

編集

以下を追加してみました:

public int? ParentID { get { return this.Parent_PageID; } set { this.Parent_PageID = value; } }
public int? Parent_PageID { get { return this.ParentID; } set { this.Parent_PageID = value; } }

しかし、これはSequence contains no elementsアクセスしようとすると発生しますPossibleParents

4

1 に答える 1

0

Fluent API を使用すると問題が発生する理由はわかりませんが、なんとか問題を解決できました。

コードを に置き換えParentIDて変更しましたParent_PageID[ForeignKey("Parent")]次に、データ注釈をに追加しましたParent_PageID。私のコードは次のようになりました:

public class Page : BaseModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PageID { get; set; }
    [ForeignKey("Parent")]
    public int? Parent_PageID { get; set; }
    public int Order { get; set; }
    public bool Live { get; set; }
    [Required]
    [MaxLength(255)]
    public string Name { get; set; }
    public string SEOTitle { get; set; }
    public string SEODescription { get; set; }
    public string SEOKeywords { get; set; }
    [AllowHtml]
    public string Content { get; set; }

    public virtual Page Parent { get; set; }
    public virtual ICollection<Page> Children { get; set; }

    public IDictionary<int, string> PossibleParents
    {
        get
        {
            Dictionary<int, string> items = new Dictionary<int, string>();
            items.Add(-1, "Please Select");

            using (var context = new WebsiteContext())
            {
                var pages = context.Pages;
                foreach (var p in pages)
                    items.Add(p.PageID, p.Name);                    
            }

            return items;
        }
    }

    public Page()
    {
        this.Order = 0;
        this.Live = false; 
    }
}
于 2013-09-29T16:20:21.327 に答える