ユーザーと組織に2つのモデルクラスがあります。エンティティフレームワークコア:ユーザーと組織の複数の関係
public class User : IdentityUser
{
[Required]
public string Name { get; set; }
[Required]
public string Surname { get; set; }
public int? OrganizationID { get; set; }
public virtual OrgList org { get; set; }
}
public class OrgList
{
public OrgList()
{
employees = new HashSet<User>();
}
public int id { get; set; }
public String name { get; set; }
public String ownerId { get; set; }
public virtual ICollection<User> employees { get; set; }
public virtual User ownerUser { get; set; }
}
ユーザーは組織の所有者でも、同じ組織の従業員でも構いません(他の従業員は組織の所有者ではありません)。
まず私は、従業員の関係を作成したのだが、
modelBuilder.Entity<OrgList>(entity =>
{
entity.HasMany(e => e.employees)
.WithOne(e => e.org)
.HasForeignKey(e => e.OrganizationID)
.OnDelete(DeleteBehavior.SetNull);
}
OK動作しますが、私は所有者のための別の関係を追加しようとする
entity.HasOne(e => e.ownerUser)
.WithOne(e => e.org)
.HasForeignKey<OrgList>(e => e.ownerId)
.OnDelete(DeleteBehavior.Cascade);
私は、移行時にエラーがあります。
'User.org'と 'OrgList.ownerUser'の間に関係を作成できません。なぜなら、alr eadyは 'OrgList.employees'と 'User.org'の間の関係です。ナビゲーションのプロパティは のみ1つの関係に参加できます。
どのように修正できますか?私はHasOptional()
とWithOptionalPrincipal()
のEFコアには存在しないEF6(EFコアではない)の答えを見つけました。
従業員のための追加のテーブルを作成せずに、またはユーザークラスにvirtual OrgList
を追加しなくてもいいですか?
私はこれについて知っています。しかし、私の例では、設計上2つしか考えられない状況があります:1)ユーザーは同じ組織の従業員と所有者です。2)ユーザーはある組織の従業員ですが、その組織の所有者ではありません。ユーザーが組織を所有している場合、プロパティ 'OwnedOrganizationId'は' OrganizationId'と同じ組織にリンクします。だから、私が推測するように、ただ1つの関係が存在する可能性があります。しかし、とにかく、それはEFデザイン(または私の心)の問題なので、他の一般化された状況についてはあなたの答えを受け入れます。 –
'entity.HasOne(e.ownerUser).WithOne()。HasForeignKey(e => e.ownerId);のようなナビゲーションなしの関係を使用します。ユーザーが所有者であるかどうかを確認するには、 'user.OrgList.ownerUser == user'をチェックします。 –
Smit