2016-08-10 8 views
0

Entity Frameworkで1:0..1の関係を定義できません。EF 1〜0..1の関係を正しく定義できません

私は "PerfData"と "AttachmentData"エンティティを持っています。 Perfは親エンティティであり、0または1つのAttachmentを持ちます。コードAttachmentData.CustomForeignKeyId

PerfData.IdにFKをですが、データベース内のFKは別の名前Attachment.PerfIdPerfData.IdにFK(これは私がここに記述したわけではない、いくつかの基底クラスと継承によるものである)である必要があります。私はこれだけを持っている場合は

public class AttachmentData { 
    ... 
    public Guid Id {get;set;} 
    public Guid CustomForeignKeyId{ get; set; } // this is FK to Perf.Id 
    public PerfData Perf { get; set; } // navigation property 
} 

と、対応する設定が

internal class AttachmentDataConfig : BaseConfig<AttachmentData> 
    { 
     public AttachmentDataConfig() : base("Attachment") 
     { 
      Property(x => x.CustomForeignKeyId) 
       .HasColumnName("PerfId"); 

      HasRequired(o => o.Perf) 
       .WithMany() 
       .HasForeignKey(f => f.CustomForeignKeyId) 
       .WillCascadeOnDelete(true); 
     } 
    } 

あり、それが正常に動作します。移行は適切に生成されます。しかし、私はまた、他の側にナビゲーションプロパティを持っている必要があります:

public class PerfData { 
    public Guid Id {get;set;}  
    public AttachmentData> Attachment { get; set; } //navigation property 
} 

私は、このナビゲーションプロパティを追加する場合は、EFがFKをすでにAttachmentテーブル内で定義された通り、不要な新しい列Perf.Attachment_Idで新しい移行を作成します。

+0

逆ナビゲーションプロパティHasRequired(O => o.Perf) .WithMany(P => p.Attachment)を定義 。 HasForeignKey(f => f.CustomForeignKeyId) .WillCascadeOnDelete(true); – DevilSuichiro

答えて

0

EFは従属側で明示的なFK列との1:0..1の関係をサポートしません(この関係は1:0..Nとみなされます)。 1:0..1の場合、それはいわゆるShared Primary Key Associationsを使用し、従属側のPKも主側のFKである。

あなたのモデルでは、CustomForeignKeyIdは冗長です。正しい(EFの観点から)モデルは次のようになります:次のように構成された

public class PerfData 
{ 
    public Guid Id { get; set; }  
    public AttachmentData Attachment { get; set; } //navigation property 
} 

public class AttachmentData { 
    ... 
    public Guid Id { get; set;} 
    public PerfData Perf { get; set; } // navigation property 
} 

internal class AttachmentDataConfig : BaseConfig<AttachmentData> 
{ 
    public AttachmentDataConfig() : base("Attachment") 
    { 
     HasRequired(e => e.Perf) 
      .WithOptional(e => e.Attachment) 
      .WillCascadeOnDelete(true); 
    } 
} 

UPATE:既存のFKフィールドを維持し、使用したい場合は 1:0

に..Nの関係、そして PerfDataクラスのナビゲーションプロパティを変更

public AttachmentData Attachment { get; set; } 

.WithMany(e => e.Attachments) 
から
public ICollection<AttachmentData> Attachments { get; set; } 

および構成

.WithMany() 

内部

+0

私はAttachment.CustomForeignKeyIdが必要です。私は定義する必要があります。最初に、それは既に基本クラスで定義されているので(私は単純化のために省略しました)、また設定する必要があるためです。 – renathy

+0

さて、上記はもちろん動作しません。しかし、投稿のタイトルを変更することをお勧めします。誤解を招くことがあります。あなたの設定では、WithManyという単語で** Many Many **と表示されます。私は最初にあなたが達成しようとしていることはサポートされていないと明確に述べたと思います。 –

+0

しかし、1:0を持つのが大丈夫ならどうすればよいでしょうか。私はおそらく、私はこのような構成で得ることができる(つまり私は1 - 0..1を持っていますが、私は0..manyとして構成します)、おそらくこれは動作しますか? – renathy

関連する問題