2

個人と会社の 2 つのエンティティがあります。会社には、1 人または複数の連絡先 (人) がいます。会社には、少なくとも 1 人の主要な連絡先 (人) がいます。これを実装する最良の方法は何ですか?

ここに画像の説明を入力

エンティティは次のとおりです。

public class Person
{
    public int PersonId { get; set; }
    public string PersonName { get; set; }
}
public class Company
{
    public int CompanyId { get; set; }
    public string CompanyName { get; set; }
    public virtual ICollection<Person> Contacts { get; set; }
    public int PrimaryContactId { get; set; }
    [ForeignKey("PrimaryContactId")]
    public virtual Person PrimaryConctact { get; set; }
}

コンテキストと初期化子:

public class TolleContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<Person> Persons { get; set; }
    public TolleContext()
    {
        Database.SetInitializer(new TolleContextInitializer());
    }
}
public class TolleContextInitializer : DropCreateDatabaseAlways<TolleContext>
{
    protected override void Seed(TolleContext context)
    {
        var p1 = context.Persons.Add(new Person { PersonName = "Anatoly" });
        var p2 = context.Persons.Add(new Person { PersonName = "Johannes" });
        var contacts = new List<Person> {p1, p2};
        var company = new Company
            {
                CompanyName = "Bool", 
                PrimaryConctact = p1, 
                Contacts = contacts
            };
        context.Companies.Add(company);
        context.SaveChanges();

        base.Seed(context);
    }
}

個人を会社として関連付けるとPrimaryContact、company.Contacts に表示されません。個人を主要連絡先として関連付け、同じ会社の連絡先リストに追加すると、エラーがスローされます。

依存操作の有効な順序を判別できません。外部キーの制約、モデルの要件、またはストアで生成された値が原因で、依存関係が存在する場合があります。

そのようなシナリオを実装する可能な方法についての回答をいただければ幸いです。

4

1 に答える 1

1

どうやら、Person複数の会社に所属することはできません。したがってPrimary、 の属性を作成できますPerson。モデルの複雑さが軽減されます。1 対多の関連付けのみが必要です。ただし、ビジネス ロジックの複雑さが増します。 (1) 主な連絡先を取得する必要があります

company.Persons.Where(p => p.IsPrimary).First();

Personこれはナビゲーション プロパティを読み取るほど簡単ではなく、(2) 1 つだけがプライマリであることを保証するロジックが必要です。

現在のモデルを保持する場合は、最初に会社とその連絡先を保存してから、2 番目のトランザクションで主要連絡先を割り当てる必要があります。1 つのトランザクションで実行すると、EF は生成された 2 つの外部キーを同時に設定できます。FK in Person の場合は company first を作成し、FK in Company の場合は Person first を作成する必要があります。

于 2013-02-09T12:16:15.853 に答える