1

複数の外部キー関係を持つ単一のロケーション テーブルがあります。これには、state テーブル、city テーブル、country テーブル、および user テーブルへの外部キーがあります。これで、テーブル モデルがエンティティ フレームワークに適切にマップされましたが、ロケーション テーブルの外部キー ID フィールドにアクセスして新しい外部キー マッピングを追加しようとすると、アクセスできず、代わりにStateReferenceなどの参照フィールドが取得されます。 .

今、entitykey.StateReference を使用してくださいという記事をいくつか見つけました。私はそれを試してみましたが、うまくいきますが、私には本当に不格好に思えます。私が気付いたのは、StateID の代わりに State フィールドも提供されていることです。そのため、州名を Location オブジェクトに渡すだけで、エンティティ フレームワークがほぼ自動的に関係を把握できると想定しています。これの適切な構文をどこでも見つけたり、見つけたりすることができません。

私がここの基地から離れている場合、誰かが正しい方向を指して私を修正してくれませんか? 私はしばらくこれにドキドキしていて、それを手に入れることができないようです. または、私が言っていることが正しい場合、誰かが構文を表示するための基本的なコードを教えてくれます。VS2010でWebサービスを作っているので、正しく理解すればef v1を使っています。以下は、私の場所オブジェクトのコードです。

    using(Entities context = new Entities())
     {
       Location NewLocation = new Location
        {
          //In SQL all three of these field are acutally foreign key ids I am 
             trying to maintian
          State = context.States.Where(i => i.State1.Equals(AddedState)),
          Country = context.Countries.Where(i => i.State1.Equals(AddedCountry)),
          City = context.Cities.Where(i => i.City1.Equals(AddedCity)),
         }
      };
      context.AddToLocation(NewLocation);
      context.SaveChanges();
     }
4

1 に答える 1

0

正しい構文は次のとおりです。

using(Entities context = new Entities())
{
    Location NewLocation = new Location
    {
      State = context.States.SingleOrDefault(s => s.ID == AddedState.ID),
      Country = context.Countries.SingleOrDefault(c => c.ID == AddedCountry.ID),
      City = context.Cities.SingleOrDefault(c => c.ID == AddedCity.ID)
    };
    context.AddToLocation(NewLocation);
    context.SaveChanges();
}

(主キー プロパティが呼び出されると仮定ID)

ところで: VS2010 を使用しても、必ずしも EF バージョン 1 を使用しているとは限りません。重要なのは、プロジェクトの .NET Framework ターゲット プラットフォームです。プロジェクトが .NET 3.5 をターゲットにしている場合は、EF バージョン 1 を使用しています。 EF バージョン 4 を使用しています (バージョン 2 と 3 は存在しません)。VS2010 で新しいプロジェクトを作成するときの既定のターゲット プラットフォームは .NET 4.0 です。そのため、ターゲット プラットフォームを明示的に .NET 3.5 に変更しない限り (または古いプロジェクトを VS2008 から VS2010 などに移行していない限り)、EF 4.0 を使用する可能性が高くなります。

質問の下のコメントでTodが述べたように、EF 4.0では、既存のデータベーススキーマからモデルを作成/更新するときに、外部キー列をモデルプロパティとして公開するオプションがあります。更新ウィザードには、[モデルに外部キー列を含める] チェック ボックスがあります。

更新ウィザード

編集

AddedStateAddedCountryおよびAddedCityがエンティティのプロパティを表す文字列である場合、クエリを次Nameのクエリに置き換えることができます。IDName

using(Entities context = new Entities())
{
    Location NewLocation = new Location
    {
      State = context.States.SingleOrDefault(s => s.Name == AddedState),
      Country = context.Countries.SingleOrDefault(c => c.Name == AddedCountry),
      City = context.Cities.SingleOrDefault(c => c.Name == AddedCity)
    };
    context.AddToLocation(NewLocation);
    context.SaveChanges();
}

の使用は、 がデータベース テーブル内で一意であるSingleOrDefaultと想定していることに注意してください。Name同じ名前のレコードが 2 つ以上ある場合SingleOrDefault、例外がスローされます (「シーケンスに複数の要素が含まれています」)。then を置き換えSingleOrDefaultFirstOrDefault、指定された名前の最初のレコードをロードするだけです。

于 2012-08-15T23:29:43.633 に答える