2016-11-19 6 views
0

EFで外部キーをnullにすることができる1対1の関係を作成する必要があります(したがって、0..1から0..1と呼ぶことができます)null可能な外部キーとの1対1の関係

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

    public int SaleId { get; set; } 
    public Sale Sale { get; set; } 
} 


public class Sale 
{ 
    public int Id { get; set; } 
    public ProductInstance ProductInstance { get; set; } 
} 

FluentAPI設定:

modelBuilder.Entity<Sale>() 
    .HasOptional(x => x.ProductInstance) 
    .WithOptionalPrincipal(x => x.Sale); 

しかし、それは表ProductInstanceに2つの列を生成します:

  • Sale_id - 外部キー
  • SaleId

ここで生成される移行コード:

CreateTable(
      "dbo.ProductInstances", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        SaleId = c.Int(nullable: false), 
        Sale_Id = c.Int(), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Sales", t => t.Sale_Id) 
      .Index(t => t.Sale_Id); 

どのように私は、外部キーになります1つの列のみSaleIdを得るために行うことができますか?

+1

なぜあなたは販売のインスタンスへの関連付けやプロパティの両方を作成しますSaleインスタンスのIDを保持していますか?そのため、表の2つの列が作成される理由があります。 –

+0

EFはEntity Frameworkを表しているため、値オブジェクトではないエンティティとしてのみ機能します。後者のバージョンでは、value-objectsもサポートしています。 – Mohamadreza

答えて

4

EFは、明示的なFKプロパティでone-to-one団体をサポートしていません - そこにはHasForeignKey流暢APIはありません、あなたがForeignKeyデータアノテーションでそれを回避しようとする場合は、移行中に、多数の例外を取得します。

唯一の解決策は、モデルで終わる、ProductInstance.SaleIdプロパティを削除することです:

public class ProductInstance 
{ 
    public int Id { get; set; } 
    public Sale Sale { get; set; } 
} 

public class Sale 
{ 
    public int Id { get; set; } 
    public ProductInstance ProductInstance { get; set; } 
} 

と設定:

modelBuilder.Entity<Sale>() 
    .HasOptional(x => x.ProductInstance) 
    .WithOptionalPrincipal(x => x.Sale) 
    .Map(a => a.MapKey("SaleId")); 
3

Entity FrameworkでOne-to-OneまたはOne-to-Zero関係を構成するのは、他の関係よりもやや複雑です!!

次のように外部キープロパティを書く:

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

    public virtual Sale Sale { get; set; } 
} 


public class Sale 
{ 
    [Key] 
    [ForeignKey("ProductInstance")] 
    public int ProductInstanceId { get; set; } 

    ///write here other properties 

    public virtual ProductInstance ProductInstance { get; set; } 
} 

は、あなたが期待通りに動作するようになりまし願っています!

さらに、通常、Entity Frameworkの命名規則に正しく従う場合、Fluent APIは必要ありません。

+0

@Alexey Markov、私のコードをテストしてください!あなたが期待どおりに動作する場合は、同様の問題を抱えている他の人々を助けるための答えとしてマークしてください! – TanvirArjel

+0

あなたのコードは動作しますが、この場合はSalesRequired ProductInstanceが必要ですが、それはわかりません。そこの主な問題 - ヌル可能な外部キー。 Ivan Stoevは、これはサポートされていないと言います。だから私のモデルから外部キーのプロパティを削除し、ナビゲーションプロパティのみを使用 –

+0

@アレクセイマルコフ、あなたは重要なポイントを欠場している! 1対1または1対0の関係の場合、NULL値の外部キーは明示的に必要ありません!外部キーはデフォルトでnullableです。あなたのコードの販売によると、デフォルトではヌル可能です。コードを実行してテストしてください! – TanvirArjel

関連する問題