13

私はエンティティ フレームワーク コード ファーストを使用してデータベース スキーマを自動的に作成しています。私のエンティティの 1 つは次のようになります。

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
}

EF がデータベースを自動生成すると、次の列を含むテーブルが生成されます。

AssessmentId (PK, FK, int, not null)
CaseStudyId (PK, FK, int, not null)
Score (int, not null)
FollowsCaseStudyId (FK, int, null)
CaseStudy_CaseStudyId (FK, int, null)

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

4

3 に答える 3

15

エンティティにはタイプの2 つのCaseStudyナビゲーション プロパティがあり、AssessmentsCaseStudiesエンティティにはAssessmentsCaseStudiesコレクションがあるため、 CaseStudyEF は、CaseStudyこのコレクションが参照する 2 つのナビゲーション プロパティのどちらかを判断できません。どちらも可能であり、どちらのオプションも有効ですが、エンティティ モデルとデータベース スキーマが異なります。

このようなあいまいな状況では、EF の規則では、実際には3 つの関係を作成します。つまり、 のコレクションCaseStudyは 2 つのナビゲーション プロパティのいずれも参照しませんCaseStudyが、3 番目の (ただし、公開されておらず、「見えない」) エンドポイントを に持っています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; }
于 2012-11-10T19:15:53.737 に答える
7

どういうわけか、Slauma のInverseProperty属性提案が機能しませんでした。データベース コンテキストのメソッドで Fluent API を使用して、とエンティティの 2 つのCaseStudyナビゲーション プロパティ間の関係を指定するとうまくいきました。AssessmentsCaseStudiesCaseStudyOnModelCreating

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);

それが追加されると、列Add-Migrationを追加しようとしなくなり、適切な外部キー関係を使用して列が追加されたときに生成される移行コード。CaseStudy_CaseStudyIdFollowsCaseStudyId

于 2012-11-11T15:08:56.263 に答える