次のようなデータモデルがあります。
public class Bubble
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection <Level> Children { get; set; }
}
public class Level
{
public int Id { get; set; }
public int BubbleId { get; set; }
public int? ParentId { get; set; }
public string Name { get; set; }
public Bubble Bubble { get; set; }
public Level Parent { get; set; }
public virtual ICollection<Level> Children { get; set; }
}
階層データを複数格納したい。各セットは、レベル(ノード)を含むバブルによって所有されています。レベルは、自己参照(親)をnull(ツリーの先頭)に設定するか、別のレベル(親のサブノード)に設定できます。
今私の問題は、技術的にはレベルは別のバブルに属している親(自己参照)を持つことができるということです。それは不可能なはずです。
同じBubbleId FKを持つレベルだけが親として割り当てられることができるということをどうやって確認できますか?
BubbleId
はLevel
の主キーの一部であるべきで、それを参照する他のレベルは同じBubbleId
を持つことが保証されます。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Level>()
.HasKey(l => new { l.Id, l.BubbleId });
modelBuilder.Entity<Level>()
.Property(l => l.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Level>()
.HasMany(l => l.Children)
.WithOptional(l => l.Parent)
.HasForeignKey(l => new { l.ParentId, l.BubbleId });
}