1

私は少し...奇妙な問題を抱えています。別のエンティティと*対1の関係を持つ新しく作成されたエンティティを保存するとエラーが発生します。説明するのは少し難しいですが、セットアップは次のとおりです。

(注:MVC 2-Entity Framework 4を使用しています)

私のエンティティは次のように設定されています(読みやすくするために名前が置き換えられていますが、構造は説明されているとおりです)。当社にはマネージャーが何人かいます。(tblManagers)各マネージャーは未定義の量のストア(tblStores)を所有しています。各店舗には、未定義の量の機器(tblEquipment)があります。したがって、私のDataModelは次のとおりです。

(tblManagers)1 <-----> *(tblStores)1 <------> *(tblEquipment)

(古いAccessファイルのエクスポートから)すでに多くのデータが含まれているため、この設定は有効です。

新しい機器を作成するときは、明らかに、それが属するストアを選択する必要があります。ドロップダウンリストで選択された値(ストアのID)は、次のコードを実行するHttpPostメソッドに渡されます。

dbは私のデータベースコンテキスト変数です

myNewItem.tblStore = db.tblStores.Single(x => x.Id == store_id_from_dropdown);

db.tblEquipments.AddObject(myNewItem);

db.SaveChanges();

これは私には有効なコードのようです。Resharperは問題を認識せず、コンパイルエラー(または警告)も認識しません。ただし、コードを実行すると、次の例外が発生します(db.SaveChanges()でスローされます)。

Entities in 'CMT_DevEntities.tbl_Stores' participate 
in the 'tblManagerstblStores' relationship. 
0 related 'tblManager' were found. 
1 'tblManager' is expected.

コードにtblManagerへの参照がないため、なぜtblManagerを見ているのかわかりません。これは店長と店の関係と関係があることは理解していますが、その理由はわかりません。

これが私を混乱させる部分です:

  • のdebugvaluesをmyNewItem見ると、ストアがエンティティに追加されていることがわかります。ストアのtblManagerプロパティを確認することもでき、それは正しいtblManagerです。したがって、これにより、データベース内のすべてに問題がないことが確認されます(ストアには、マネージャーがない場合でも存在できませんでした)。
  • 私は実際にコードの一部を省略しました。機器にはまったく同様のナビゲーションプロパティがあります(たとえば、サプライヤ。サプライヤには国へのナビゲーションプロパティがあります。関係はまったく同じです)。ただし、これについてはエラーは発生しません。ストア/マネージャーのもののみ。

私はおそらく何か、おそらく非常に単純なものが欠けています。いずれにせよ、なぜこれが起こっているのか私にはわかりません。

だから私の質問は:MVCのModelBinderによって作成されたエンティティとナビゲーションプロパティの(int)IDが与えられた場合、新しいエンティティをデータベースに追加するにはどうすればよいですか?

4

2 に答える 2

1

すべてのエンティティをロードする代わりにStore、外部キー ID をエンティティに追加できStoreますEquipment( equipment.StoreId)。

これにより、グラフ全体をロードすることなく、EF が新しく作成されたエンティティEquipmentとエンティティの間の関係を確認できるようになります。Store

モデル ファーストのアプローチを使用しているため、これを行う方法に関するドキュメントはMSDN にあります。

重要な部分は注セクションにあります。

[ナビゲーション プロパティ] チェック ボックスと [外部キー プロパティをエンティティに追加] チェックボックスをオフにすることで、関連付けの最後にあるエンティティにナビゲーション プロパティまたは外部キー プロパティを追加しないように選択できます。ナビゲーション プロパティを 1 つだけ追加すると、関連付けは一方向にのみトラバース可能になります。ナビゲーション プロパティを追加しない場合は、関連付けの最後にあるエンティティにアクセスするために、外部キー プロパティを追加することを選択する必要があります。多対多 ( : ) および 1 対 1 (1:1) の関連付けの場合、エンティティに外部キーを追加することはできません。詳細については、「リレーションシップの定義と管理 (Entity Framework)」を参照してください。

[関連付けの追加] ダイアログで、['Equipment' エンティティに外部キー プロパティを追加する] をオンにする必要があります。外部キー プロパティの使用は、Entity Framework 4 の新機能です。これにより、作業がずっと簡単になります。

ここでは、より詳細な説明を見つけることができます。

于 2012-08-06T11:41:00.683 に答える
0

エンティティを適切に構成する必要があります。外部キーを介してリンクされた 2 つのエンティティがある場合は、ナビゲーション プロパティを構成する必要があります。例:

public class Destination
{
    public int DestinationId { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string Description { get; set; }
    public byte[] Photo { get; set; }
    public List<Lodging> Lodgings { get; set; }
}

public class Lodging
{
     public int LodgingId { get; set; }
     public string Name { get; set; }
     public string Owner { get; set; }
     public bool IsResort { get; set; }
     public decimal MilesFromNearestAirport { get; set; }
     public int DestinationId { get; set; }
     public Destination Destination { get; set; }
}

internal class LodgingConfiguration:EntityTypeConfiguration<Charge>
{
    HasRequired(d=>d.Destination).WithMany(l=>l.Logings).HasForeignKey(d=>d.DestinationId)
}

Logging の作成は次のようになります。

var loging = new Loging
                 {
                     ...initialize properties...
                     Destination = new Destination{..initialize destination..}
                 }
context.Add(loging);
context.SaveChanges();
于 2012-08-07T06:32:05.320 に答える