3

Entity Framework (既存の MSSQL データベースから) によって生成されたモデルに外部キーを含めるオプションを少しいじっています。

Person と Company のモデルがあり、両方を同時に作成したいとします。企業が複数の人を持つことができる場所。Person には Id、Name、CompanyId があり、Company には Id と Name があります。

互いに関連する新しいオブジェクトを作成する方法がよくわかりません。私がある程度理解した1つの方法は次のとおりです。

// Company needs ID and Name, and ID is auto generated, so -1
Model.Company newCompany = Model.Company.CreateCompany(-1, "Test Inc");

// Person needs ID, Name and a CompanyID. What is CompanyId supposed to be?
Model.Person newPerson = Model.Person.CreatePerson(-1, "John Doe", -1);

// And to actually get the Company relation going
newPerson.Company = newCompany;

続いて、それをコンテキストに追加して保存します。

さて、これは機能しますが、これが私がすべきことかどうかわかりませんか?

代わりに、これらの作成を抽象化すると想像する場合 (これは、アプリケーションのほとんどの部分にあるものです)。次の関数があるかもしれませんが、このオブジェクトの EntityState が不明であっても、ID を指定する必要があります。すべての会社が新しい会社というわけではありません。だから私はこれを行うことはできません:

public static Model.Person CreatePerson(string name, Model.Company company) {
    Model.Person newPerson = Model.Person.CreatePerson(-1, name, company.Id);
    return newPerson;
}

ただし、その会社が新しく追加されたオブジェクトの場合、これは失敗します。そのため、Create メソッドで実際の ID を使用することは役に立たないと私は信じていますか? エンティティの状態を確認しない限り、次のことをしなければならなくなるからです。

public static Model.Person CreatePerson(string name, Model.Company company) {
    Model.Person newPerson = Model.Person.CreatePerson(-1, name, -1);
    newPerson.Company = company;
    return newPerson;
}

外部キー ID を使用してオブジェクトを作成すると、ID はあるがオブジェクトはなく、データベースからオブジェクト全体を実際にフェッチする必要がない場合に、その利点を認識しています。しかし、私はこのことについて最善を尽くす方法について完全に混乱しています。

4

1 に答える 1

1

Companyメソッド内の新しいケースと既存のケースの両方をカバーするには、おそらく外部キー プロパティとナビゲーション プロパティの両方を設定する必要があります。

public static Model.Person CreatePerson(string name, Model.Company company) {
    Model.Person newPerson = Model.Person.CreatePerson(-1, name, company.Id);
    newPerson.Company = company;
    return newPerson;
}
  • が新しい場合company、EF は値を無視し、ナビゲーション プロパティのみnewPerson.CompanyIdに基づいてリレーションシップを作成します。newPerson.Company
  • companyが (状態Unchangedまたはで) 存在する場合Modified、FK プロパティnewPerson.CompanyIdは主キーの値newPerson.Company.Idと一致する必要があります。そうでない場合は、例外が発生します。
于 2012-10-30T16:19:48.443 に答える