2012-11-09 15 views
12

私は自動的に私のデータベーススキーマを作成するには、エンティティフレームワークのコード最初を使用していて、私のエンティティの一つは次のようになります。EFの私のデータベースを自動生成するときEFコードで最初に不要な外部キー列を生成するのはなぜですか?

public class AssessmentsCaseStudies { 
    #region Persisted fields 
    [Required] 
    [Key, Column(Order=0)] 
    [ForeignKey("Assessment")] 
    public int AssessmentId { get; set; } 

    [Required] 
    [Key, Column(Order=1)] 
    [ForeignKey("CaseStudy")] 
    public int CaseStudyId { get; set; } 

    [Required] 
    public int Score { get; set; } 

    [ForeignKey("Follows")] 
    public int? FollowsCaseStudyId { get; set; } 
    #endregion 

    #region Navigation properties 
    public virtual Assessment Assessment { get; set; } 
    public virtual CaseStudy CaseStudy { get; set; } 
    public virtual CaseStudy Follows { get; set; } 
    #endregion 
} 

、それは次の列を持つテーブルを作成します:

これはCaseStudy_CaseStudyIdの列以外はすべて問題ありません。なぜそれが生成されたのですか?それはなんのためですか?どうやってそれを止めることができますか?私の疑惑は、CaseStudyのとCaseStudyIdの列を自動的に一致させることができなくなるため、そのナビゲーションプロパティ用に2つの列をリンクする独自の列を作成するということです。

+0

私はその質問に対する受け入れられた答えを本当に理解していません。私はAssessmentsCaseStudiesに2つの 'CaseStudy'参照を正確に持っていますので、多対多の関係は本当にありませんし、なぜ接合テーブルが必要なのかわかりません。私は 'public virtual ICollection AssessmentsCaseStudies {get;}を持っています。セット; } '' CaseStudy'では、それで、ICollectionは 'FollowSCaseStudyId' FKではなく、' CaseStudyId' FKに関連していると言い方をしたいと思います。 – Jez

+0

私はそれが役に立つ情報を含むことができると思った。 'Assessment'、' CaseStudy'、 'AssesmentCaseStudy'エンティティのみで、それぞれが' ID'フィールドと 'AssesmentID'と' CaseStudyIDを含む 'AssesmentCaseStudy'エンティティを含む、トリムダウンされたサンプルを作成できますか? 'フィールド?問題はそれでも起こりますか? – CodeCaster

+1

"dupe"質問に対する受け入れられた答えがうまく説明できず、より良い答えが欲しいので、この質問は閉じていたはずがないと思います。再票に投票してください。 – Jez

答えて

7

何らかの理由で、SlaumaのInverseProperty属性の提案が機能しませんでした。それが生成されています追加、移行コードです一度

modelBuilder.Entity<AssessmentsCaseStudies>() 
    .HasRequired(acs => acs.CaseStudy) 
    .WithMany(cs => cs.AssessmentsCaseStudies) 
    .HasForeignKey(acs => acs.CaseStudyId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<AssessmentsCaseStudies>() 
    .HasOptional(acs => acs.Follows) 
    .WithMany() // No reverse navigation property 
    .HasForeignKey(acs => acs.FollowsCaseStudy) 
    .WillCascadeOnDelete(false); 

:どのような仕事をしたことは私には私のデータベースコンテキストのOnModelCreating方法で流暢APIを介して、AssessmentsCaseStudiesで2つのCaseStudyナビゲーションプロパティ、およびCaseStudyエンティティ間の関係を規定してI Add-Migrationは、もはやCaseStudy_CaseStudyId列を追加しようとせず、適切な外部キーの関係で、FollowsCaseStudyId列が追加されました。

+0

あなたは 'InverseProperty'あなたはまだ3番目のFKを持っていましたか?それはうまくいったはずです。 Fluentマッピングと同じことを行います。ただし、1つ目のリレーションシップのカスケード削除は無効になりません(2つ目のカスケード削除はオプションであるためデフォルトでオフになっています)。 – Slauma

+0

まだ3番目のFKが作成されています。 – Jez

16

あなたCaseStudyエンティティであなたのAssessmentsCaseStudiesエンティティにおけるタイプCaseStudyのナビゲーションプロパティとAssessmentsCaseStudiesコレクションを持っているのでEFは、このコレクションが参照する2つのCaseStudyナビゲーションプロパティのかを決定することはできません。どちらも可能であり、どちらのオプションも有効ではあるが異なるエンティティモデルとデータベーススキーマになります。 EF規則は、実際に関係を作成することです、このようなあいまいな状況で

CaseStudyであなたのコレクションが2つのCaseStudyナビゲーションプロパティのいずれかを指すが、(露出され、「目に見えない」ではなく)三分の一を持っていない、すなわち、エンドポイントはAssessmentsCaseStudiesです。この3番目の関係は、データベースで表示される3番目の外部キー(アンダースコア付きの外部キー)の理由です。

この問題を修正して規約を変更するには、[InverseProperty]属性を適用して、CaseStudyナビゲーションを指定することができます(アンダースコアは常にマッピング規則によって何か起こっていることを強く示しています)プロパティAssessmentsCaseStudiesコレクションが属する:

[InverseProperty("AssessmentsCaseStudies")] // the collection in CaseStudy entity 
public virtual CaseStudy CaseStudy { get; set; } 

あなたはまた(あるいは、あなたは両方を必要としない)、コレクション側の属性を置くことができます。

[InverseProperty("CaseStudy")] // the CaseStudy property in AssessmentsCaseStudies entity 
public virtual ICollection<AssessmentsCaseStudies> AssessmentsCaseStudies { get; set; } 
+0

私は何か類似している - 私はあなたの提案を試みたが、例外があった。あなたに分がある場合:http://stackoverflow.com/questions/19802324/why-is-this-column-getting-generated-in-ef-code-first-migrations – RobVious

0

ここで解決策を探している人は、以前の回答を試してまだ余分な外部キー列がある場合は、意図していないPOCOクラスをさらに詳しく定義したプロパティを探してくださいDBフィールドにマップします。複雑なgetアクセサの場合のようにコードブロックが含まれていても、Entity Frameworkはそれらをデータベースにマッピングしようとします。これにより、プロパティがエンティティを返す場合に、余分な外部キー列が発生する可能性があります。安全のために、[NotMapped]属性でそのようなプロパティを装飾するか、またはメソッドに変換してください。

関連する問題