2017-03-09 6 views
0

Entity Frameworkコードの最初の移行を使用して、SQL Serverデータベースに作成する次の3つのクラスを設定しました。 調査オブジェクトがメインテーブルです。Entity Frameworkによるコードの最初のマイグレーションでの不正なPK-FKマッピング

public class Survey 
{ 
    public int SurveyId {get; set;} //Primary Key 
    public string Description {get; set;} 
    public bool HasDevice {get; set;} 
    public bool HasProcess {get; set;} 

    public virtual Process Process {get; set;} 
    public virtual ICollection<Device> Devices {get; set;} 
} 

各調査各調査は一プロセス(1対0..1)を有していなければならない複数デバイス(1対多)

public class Device 
{ 
    public int DeviceId {get; set;} //Primary Key 
    public string DeviceType {get; set;} 

    public int SurveyId {get; set;} //Foreign Key 
    public virtual Survey Survey {get; set;} 
} 

を有することができます

public class Process 
{ 
    public int ProcessId {get; set;} //Primary Key 
    public string ProcessInfo {get; set;} 

    public int SurveyId {get; set;} //Foreign Key 
    public virtual Survey Survey {get; set;} 
} 

これらのクラスのFluent APIマッピングは、次のようになります。

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

    modelBuilder.HasDefaultSchema("Survey"); 
    modelBuilder.Entity<Survey>().HasOptional(x => x.Process).WithRequired(x => x.Survey); 
    modelBuilder.Entity<Survey>().HasMany(x => x.Devices).WithRequired(x => x.Survey); 
} 

問題は、私は、コード最初のマイグレーションを適用すると、プロセス・テーブル(1対0..1)中のForeignKeyプロパティはSurveyIdではなくProcessIdフィールドに設定取得し続けることです。

FOREIGN KEY制約「FK_Survey.Processes_Survey.Surveys_ProcessId」と競合INSERT文:これは私が新しいプロセスレコードを追加しようとするたびに、私は次のエラーを取得することを意味します。衝突は、データベース "Backflow"、テーブル "Survey.Surveys"、列 "SurveyId"で発生しました。

Deviceの1対多マッピングはうまく動作します。

これは私のPKフィールドがすべてIdと言われていたからですが、追加のラベル部分に追加した後でも、間違ったPK-FKリンクが作成されます。また、DataAnnotation [Key, ForeignKey("xyz")]を追加してFluent APIを回避しようとしましたが、同じ結果があります。プロジェクトを再コンパイルし、Visual Studioを再起動し、新しいプロジェクトと新しいデータベースを作成することは役に立ちません。

Fluent APIまたはDataAnnotationsには、これが正しく結合されるために欠けているものがありますか?また、データベースでFKを手動で修正すると、が動作するようになりますが、そのようなコードマイグレーションの目的は、マイグレーションでCode Firstのすべてを行うという目的に反するものです。

+0

'プロセス。ProcessIdは、[1:1の関係](http://stackoverflow.com/a/26425364/861716)にあるとき、PKとFKの両方であるはずです。 1-0..1のときにも。したがって、 'SurveyId'プロパティを削除する必要があります。 –

+0

@Gert OK、私は混乱しています。 'SurveyId'がProcessオブジェクトから削除された場合、それはForeignKeyingですか? ProcessIDフィールドは、Surveyレコードと同じIDを取得しますか? – techturtle

+0

はい、これがアイデアです。これはそれが属する「調査」に一意に結びついています。これは、 'Process.ProcessId'がID列でないことも意味します。 –

答えて

2

1-0..1関係の流暢なマッピングが正しいです:

modelBuilder.Entity<Survey>() 
    .HasOptional(s => s.Process) 
    .WithRequired(p => p.Survey); 

しかしProcessSurveyIDプロパティ(および列)を持つべきではありません。 EF6では、に従属するの1-0.1の関係(ここではProcess)は、外部キーとしてのプリンシパル(ここではSurvey)を参照する主キーを持つことになっています。したがってProcess.ProcessIDは主キーと外部キーの両方です。従って、1つのProcessは、1つのSurveyに一意に結び付けられています。

ところで、もう1つのマッピングでは、私は外来キーについても言及します。

modelBuilder.Entity<Survey>() 
    .HasMany(s => s.Devices) 
    .WithRequired(d => d.Survey) 
    .HasForeignKey(d => d.SurveyId); 
関連する問題