2016-09-22 12 views
1

FooBarの間には関係がないようです。この構造により1から0へ... 1つの関係

public class Foo 
{ 
    [Key] 
    public int Id { get; set; } 

    public int Name { get; set; } 

    public virtual Bar Bar { get; set; } 
} 


public class Bar 
{ 
    [Key] 
    public int Id { get; set; } 

    public int Name { get; set; } 

    public int FooId { get; set; } 

    public virtual Foo Foo { get; set; } 
} 

私は、通常はFooで

public virtual ICollection<Bar> Bars { get; set; } 

を持っていますが、この例では、それは私のデータの実行可能な表現ではありません。いつもあなたが見

....

フーは常にバー を持っていないだろう...しかし... バーは常にのFooとそのFooIdを持つことになりますバーで一意であること。

public class MyContext : DbContext 
{ 
    public DbSet<Foo> Foos { get; set; } 

    public DbSet<Bar> Bars { get; set; } 

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     // ............... 

     modelBuilder.Entity<Foo>() 
        .HasOptional(cpi => cpi.Bar) 
        .WithRequired(api => api.Foo); 

     // ............... 
    } 
} 

私は関係を定義する際に複数の試行を試みましたが、正しいと思われませんでした!私はまた、それが私が欲しいものをすることを可能にするならば、ヌル可能なBarIdをFooに加えることができます(しかし私はそうしたくないです)。 (編集1を参照)

私はそれをたくさん試してみました(そして検索して試してみました)。

すべての入力をいただければ幸いです。

おかげ


(浪費家のコメントに応答して)編集1:

私はせずに解決策を見つけるしたいと思いますので、これらのテーブルには、すでにライブ環境の数で存在し、データに満ちていますdbテーブルの定義を編集する...しかし、それが可能でない場合、私は必要なものを達成するために列を追加することができます。

は以前、私はそれが

public virtual ICollection<Bar> Bars { get; set; } 

...のように定義持っていた...しかし、それは私がこれらのテーブルを使用して書いていたコードの一部では動作しません。


編集2:私がしようとするとバーを追加するとき

上記のコードは、次のエラーが発生します。

"IDENTITY_INSERTがOFFに設定されている場合、テーブル 'Bar'のID列に明示的な値を挿入できません。

アイデンティティの挿入がオフになっていない、私はこれらのテーブルの自分の定義に基づいてEFがオフになっているこのインスタンスを除いて、すべてのテーブルに使用します。

+0

は「それは私がやりたいように私を可能にする場合、私はまた、fooへのNULL可能BarIdを追加することができます(私は希望しないように)」正しい答えは、あなたがしたくない何かがあるときは、あなたのケースでこれがなぜ適切でないのかについての正当な理由があるはずです。なぜあなたはこれをしたくないのですか? – spender

+0

編集1 – Beakie

+0

を参照してください。ヌルを許可するデータベーススキーマに外部キーが必要ですか? – spender

答えて

0

だからあなたの本当の問題は

あるテーブル「バー」にID列に明示的な値を挿入することはできませんIDENTITY_INSERTがまずOFF

をオフに設定されている場合、このエラーメッセージの意味:あなたのアールがしよう現行のアクションを許可しないように現在設定されている場合は、ID列に値を挿入します(オフ)

Identity ColumnについてEFに通知していないため、Entity Frameworkがおそらくゼロを挿入しようとしています。あなたが明示的に

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Foo>() 
       .HasOptional(cpi => cpi.Bar) 
       .WithRequired(api => api.Foo); 

    // needed 
    modelBuilder.Entity<Bar>() 
     .HasKey(b => b.Id) 
     .Property(b => b.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
} 
+0

を参照してください。テーブル定義の1対1リレーションシップ・バージョンを試す前に、その列にIDを使用して完全に正しく挿入していました。私はそれを明示的に定義していませんでした。 – Beakie

+0

私は、この特定の問題を解決する方法を教えています。これは他の関係として以前はうまくいきましたが、このエラーメッセージにはこの関係の解決策があります。 –

+0

私は今すぐ取得します..... ReferentialConstraintの依存プロパティはストア生成の列にマップされます。 Column:Id – Beakie

0

たちはDataAnnotationsに努める...あなたのこの列は、データベースからあなたのIDの生成されたEFを伝える必要があり、どの意味?

public class Foo 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual Bar Bar { get; set; } 
} 


public class Bar 
{ 

    [Key, ForeignKey("Foo")] 
    public override int Id {get;set;} 

    public string Name { get; set; } 

    public virtual Foo Foo { get; set; } 
} 
+0

私の謝罪、テーブルはキーで定義されていますが、私のFoo/Barの例では、それらの注釈は含めませんでした。 – Beakie

+0

これを今追加しました。上記を参照してください。 – Beakie

+0

あなたは '1:1'を必要としませんか?なぜ私のものはあなたのために働いていないのですか? – Sampath

0

オブジェクトがNULL可能であるため、関係は任意であることは、あなたの.HasOptional()宣言とは異なる何かをする必要はありません。

ただし、あなたの関係には外部キーがありません。

public class Foo 
{ 
    [Key] 
    public int Id { get; set; } 

    public int Name { get; set; } 

    public int BarId { get; set; } // Add this! 

    [ForeignKey(nameof(BarId))] // Add this! 
    public virtual Bar Bar { get; set; } 
} 

public class Bar 
{ 
    [Key] 
    public int Id { get; set; } 

    public int Name { get; set; } 

    public int FooId { get; set; } 

    [ForeignKey(nameof(FooId))] // Add this! 
    public virtual Foo Foo { get; set; } 
} 
関連する問題