sql >> データベース >  >> RDS >> Sqlserver

多重度制約が SQL Server 2008 に違反しました - CodeFirst

    あなたはおそらく、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 での結果は次のとおりです:



    1. MySQLでNull値を比較する方法

    2. JSTLを使用して、別のドロップダウン選択に基づいて値をドロップダウンリストに入力します

    3. MySqlは、列名として動的な行の値を選択します

    4. Accessで計算フィールドを作成する方法