0

次のようなテーブル構造があります。

Companies           Addresses
*********           *********
ID                  ID
AddressID           ...
BillingAddressID    ...

AddressID と BillingAddressID は、Addresses テーブルに存在する外部キーです。会社のクラスで取得すると予想されるもの (AddressID、BillingAddressID) を取得する代わりに、このテーブルに基づいてモデルを生成すると。私は以下を取得します:

public Addresses Addresses { .. }
public global::System.Data.Objects.DataClasses.EntityReference<Addresses> AddressesReference { .. }
public Addresses Addresses1 { .. }
public global::System.Data.Objects.DataClasses.EntityReference<Addresses> Addresses1Reference { .. }

BillingAddress を Addresses1 に置き換えているようです (なぜそうなのかはよくわかりません)。また、これは、外部キーがある場合はどこでも一般的であるようです。つまり、ID の代わりに Table を取得してから TableReference を取得します。

何が起こっているかを確認できると思います。つまり、ID だけを提供するのではなく、ルックアップを行い、ID が参照する実際のレコードを見つけます。ただし、TableReferenceフィールドが何のためにあるのかよくわかりません....

これをもう少しうまく説明できますか?

前もって感謝します。

4

3 に答える 3

2

リレーションシップは、エンティティと同じ方法で、Entity Framework のオブジェクトとして表されます。直接多くの作業を行わなくても、リレーションシップ オブジェクトは EF の第一級市民です。EF は、エンティティの場合と同様に、リレーションシップの変更を追跡するために ObjectStateEntry オブジェクトを作成します。

そのため、参照が 2 つあります。1 つ目の AddressesReference は、正確なエンティティではなく関係オブジェクトへの参照であり、2 つ目の Addresses は実際のエンティティです。

Peter Chan (リンク) と Julia Lerman は、彼女の著書 Programming Entity Framework, 1st Edition で、EF で関係がどのように機能するかを理解することが非常に重要であると述べています。また、彼らは、これが EF を使い始めたときに開発者を混乱させる最初のことであると述べています。

于 2009-08-30T10:18:27.280 に答える
0

外部キーは、外部キーが指すエンティティ (コレクション) への参照に置き換えられます。

会社に住所を追加するには、次のようにします。

Address a = new Address();
// ... set variables for address here

currentCompany.Addresses = a;
// or, the other way round (for collections)
a.Companies.Add(currentCompany);
于 2009-08-29T09:08:35.847 に答える
0

EF は、モデルを構築するときにテーブル名を参照点として使用します。これが、"Addresses" と Addresses1" が表示される理由です。エンティティ モデルを GUI 形式で開き、各関連付けをクリックすることができます。これらの名前は変更できます。参照をクリックしてマッピングを表示し、「BillingAddressID」を「BillingAddressID」にマップするものであることを確認し、その参照の名前を「BillingAddress」に変更します。

現在の「住所」参照は「BillingAddressID」をマッピングするものである可能性があるため、両方の参照を確認する必要があることに注意してください。

同様に 1 対 1 のマッピングである場合は、「AddressID」のマッピングを「Addresses」ではなく「Address」に変更することをお勧めします。

于 2009-08-30T00:52:49.083 に答える