組織構造を表すグループの階層を構築しています。トップレベルのグループが 1 つあり、そこに複数のサブグループがあります。各サブグループは、任意の数のサブグループを持つことができます。
2 つのテーブルを持つ SQL データベースをセットアップしました。
次の列を持つグループ。
- ID (整数)
- 説明 (nvarchar(max))
次の列を持つ GroupChildren。
- ID (整数)
- グループ ID (int)
- ChildGroupId (整数)
例として、グループ 1 にグループ 2 とグループ 3 の 2 つのサブグループがある場合、グループ テーブルには 3 つのレコードがあります。
- ID - 1、説明 - グループ 1
- ID - 2、説明 - グループ 2
- ID - 3、説明 - グループ 3
GroupChildren テーブルには 2 つのレコードがあります
- Id - 主キー ID、GroupId - 1、ChildGroupId - 2
- Id - 主キー ID、GroupId - 1、ChildGroupId - 3
これにより、2 つの子グループがグループ 1 にリンクされます。これを表す 2 つの POCO クラスが次のようになります。
public class Group
{
public int Id { get; set; }
public string Description { get; set; }
public virtual ICollection<GroupChild> GroupChildren { get; set; }
}
public class GroupChild
{
public int Id { get; set; }
public int GroupId { get; set; }
public Group ChildGroup { get; set; }
}
次のように設定されたこれらのクラスの両方のマッパーを作成しました
internal class GroupMapper : EntityTypeConfiguration<Group>
{
internal GroupMapper()
{
HasKey(t => t.Id);
Property(t => t.Id).HasColumnName("Id").IsRequired();
Property(t => t.Description).HasColumnName("Description").IsRequired();
ToTable("Groups");
}
}
internal class GroupChildMapper : EntityTypeConfiguration<GroupChild>
{
internal GroupChildMapper()
{
HasKey(g => g.Id);
Property(g => g.Id).HasColumnName("Id").IsRequired();
Property(g => g.GroupId).HasColumnName("GroupId").IsRequired();
HasRequired(g => g.ChildGroup)
.WithMany()
.Map(x => x.MapKey("ChildGroupId"))
.WillCascadeOnDelete(false);
ToTable("GroupChildren");
}
}
呼び出すグループとサブグループを取得するには
return GetDbSet<Group>()
.Where(c => c.Id == id)
.Single();
これにより、ID と説明を含むグループが返されますが、GroupChildren プロパティを見ると次のエラーが発生します。
列名 'Group_Id' が無効です。
列名 'Group_Id' が無効です。
列 'Group_Id' は、コードまたはデータベースのどこにも存在しません。他の投稿を見てこれを解決しようとしましたが、EF がプライマリ/外部キーの値を解釈する方法であると示唆する人もいますが、これを解決する方法が見つかりませんか?
ありがとう