2017-09-08 11 views
1

ユーザーと組織に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を追加しなくてもいいですか?

答えて

0

従業員関係に使用しているユーザーと同じプロパティで所有者関係を作成しようとしています。エンティティフレームワークは、プロパティを割り当てる関係を認識しません。あなたは

public int? OwnedOrganizationID { get; set; } 
public virtual OrgList OwnedOrg { get; set; } 

のように、ユーザーに別のプロパティを作成し、

entity.HasOne(e => e.ownerUser) 
.WithOne(e => e.OwnedOrg) 
.HasForeignKey<OrgList>(e => e.ownerId) 
.OnDelete(DeleteBehavior.Cascade); 

に文を変更した場合、私はそれが動作するはずです想像してください。

+0

私はこれについて知っています。しかし、私の例では、設計上2つしか考えられない状況があります:1)ユーザーは同じ組織の従業員と所有者です。2)ユーザーはある組織の従業員ですが、その組織の所有者ではありません。ユーザーが組織を所有している場合、プロパティ 'OwnedOrganizationId'は' OrganizationId'と同じ組織にリンクします。だから、私が推測するように、ただ1つの関係が存在する可能性があります。しかし、とにかく、それはEFデザイン(または私の心)の問題なので、他の一般化された状況についてはあなたの答えを受け入れます。 –

+0

'entity.HasOne(e.ownerUser).WithOne()。HasForeignKey (e => e.ownerId);のようなナビゲーションなしの関係を使用します。ユーザーが所有者であるかどうかを確認するには、 'user.OrgList.ownerUser == user'をチェックします。 – Smit

関連する問題