あなたはおそらく、NationAllies
間の関係を自動的に作成する EF Code-First マッピング規則の犠牲者です。 そして toNation
私の理解が正しければ (100% 確実ではありませんが)、実際には 2 つの関係が必要であり、それぞれのエンティティで関係の一方の端のみを公開したことになります。だから、NationAllies
toNation
を指していません しかし、あなたの NationAlly
の「見えない」所有国に
その場合は、規則のマッピングを明示的に上書きする必要があります。 EF 4.1 の Fluent API では、これは次のようになります。
public class MyContext :DbContext{ public DbSet Nations { get;設定; } パブリック DbSet NationAllies { get;設定; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(n => n.NationAllies) .WithRequired() .Map(conf => conf.MapKey("OwnerID")) .WillCascadeOnDelete(間違い); modelBuilder.Entity() .HasRequired(a => a.toNation) .WithMany() .Map(conf => conf.MapKey("NationID")) .WillCascadeOnDelete(false); }}コード> プレ>
このマッピングにより、2 つの外部キー OwnerID
が作成されます および NationID
NationAllies
で テーブル、どちらも主キー ID
を指しています 国
で
編集
これが私がテストしたアプリケーションです:
- VS2010 / .NET 4.0 で新しいコンソール アプリを作成し、「NationsApp」という名前を付けます
- 「EntityFramework.dll」への参照を追加
- 「Program.cs」の内容を消去し、代わりに以下を貼り付けます:
Program.cs の内容:
using System;using System.Collections.Generic;using System.Data.Entity;namespace NationsApp{ public class Nation { public int ID { get;設定; } public int 名 { get;設定; } public List NationAllies { get;設定; } } public class NationAlly { パブリック int ID { get;設定; } public int レベル { get;設定; } public Nation toNation {get;}設定; public class NationsContext :DbContext { public DbSet Nations { get; } }設定; } パブリック DbSet NationAllies { get;設定; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(n => n.NationAllies) .WithRequired() .Map(conf => conf.MapKey("OwnerID")) .WillCascadeOnDelete(間違い); modelBuilder.Entity() .HasRequired(a => a.toNation) .WithMany() .Map(conf => conf.MapKey("NationID")) .WillCascadeOnDelete(false); } } class Program { static void Main(string[] args) { using (var context =new NationsContext()) { try { // 3 つの国家と 2 つの同盟国 Nationnation1 =new Nation() { NationAllies =new List<国民同盟>() }; Nation national2 =new Nation() { NationAllies =new List() }; Nation national3 =new Nation() { NationAllies =new List() }; NationAlly ally1 =new NationAlly(); NationAlly ally2 =新しい NationAlly(); // Nation1 には 2 つの Allies がいます // (Nation1 は両方の Allies の「所有者」です)nation1.NationAllies.Add(ally1); national1.NationAllies.Add(ally2); // ally1 の toNation は Nation2 を参照します ally1.toNation =national2; // ally2 の toNation は Nation3 を参照します ally2.toNation =national3; context.Nations.Add(nation1); context.Nations.Add(nation2); context.Nations.Add(nation3); context.SaveChanges(); } キャッチ (例外 e) { スロー; } } }}}コード> プレ>
"throw" にブレークポイントを設定して、デバッガーで e で発生する可能性のある例外を監視できます。
これにより、NationsApp.NationsContext
というデータベースが作成されます。 SQL Server Express を使用していて、それ以上の接続文字列が定義されていない場合。
2 つの関係 Nation_NationAllies
を提供します (FK は「OwnerID」) および NationAlly_toNation
(FK は「NationID」です)。すべての列は null 非許容です。 DB での結果は次のとおりです: