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のすべてを行うという目的に反するものです。
'プロセス。ProcessIdは、[1:1の関係](http://stackoverflow.com/a/26425364/861716)にあるとき、PKとFKの両方であるはずです。 1-0..1のときにも。したがって、 'SurveyId'プロパティを削除する必要があります。 –
@Gert OK、私は混乱しています。 'SurveyId'がProcessオブジェクトから削除された場合、それはForeignKeyingですか? ProcessIDフィールドは、Surveyレコードと同じIDを取得しますか? – techturtle
はい、これがアイデアです。これはそれが属する「調査」に一意に結びついています。これは、 'Process.ProcessId'がID列でないことも意味します。 –