web-dev-qa-db-ja.com

レガシーデータベースに対するコードファーストEF 4.1 MVC-多重度の競合

どのように混ぜてもエラーが発生します。これらのエラーが発生し続けているので、明らかなものがないと感じています。

モデルの生成中に1つ以上の検証エラーが検出されました:

System.Data.Edm.EdmAssociationType::多重度は、関係「Venue_Courses」のロール「Venue_Courses_Source」の参照制約と競合します。依存ロールのすべてのプロパティはnullにできないため、主ロールの多重度は「1」である必要があります。

System.Data.Edm.EdmAssociationEnd::関係「Venue_Courses」のロール「Venue_Courses_Target」では多重度が無効です。依存ロールはキープロパティを参照するため、依存ロールの多重度の上限は1である必要があります。

コースには1つの場所しか設定できません。場所は多くのコースで使用できます

public class Course
{
    [Key]
    public virtual int Id { get; set; }
    public string Title { get; set; }
    public DateTime StartDate { get; set; }
    public int VenueId { get; set; }

    public virtual Venue Venue { get; set; }
}

public class Venue
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    #region Courses
    //Table Alias
    modelBuilder.Entity<Course>().ToTable("DBSCHEMA.TR_COURSES");
    //Keys
    modelBuilder.Entity<Course>().HasKey(c => c.Id);
    //Joins
    //Join to Venues
    modelBuilder.Entity<Course>().HasOptional(c => c.Venue);

    //Fields
    modelBuilder.Entity<Course>().Property(c => c.Id).HasColumnName("COURSE_ID");
    modelBuilder.Entity<Course>().Property(c => c.Title).HasColumnName("CR_TITLE");
    modelBuilder.Entity<Course>().Property(c => c.StartDate).HasColumnName("START_DATE");
    modelBuilder.Entity<Course>().Property(c => c.VenueId).HasColumnName("VENUE_ID");
    #endregion


    #region Venues
    //Table Alias
    modelBuilder.Entity<Venue>().ToTable("DBSCHEMA.VENUES");
    //Keys
    modelBuilder.Entity<Venue>().HasKey(v => v.Id);
    //Joins
    modelBuilder.Entity<Venue>().HasMany(venue => venue.Courses);
    //Fields
    modelBuilder.Entity<Venue>().Property(v => v.Id).HasColumnName("VENUE_ID");
    modelBuilder.Entity<Venue>().Property(v => v.Name).HasColumnName("VENUE_NAME");
    #endregion

}
53
David C

これがまだ時間通りにあなたを助けることを願っています。私もまったく同じ問題を抱えていて、間違いを見つけるまでほぼ1時間問題を抱えていました。

問題は、Course.Venueの関係がオプションである(fluent APIで宣言されているように)ことですが、Course.VenueIdのId宣言は必須であるため、次のように変更して、VenueIdをオプションにすることができます。

public int? VenueId { get; set;}

または、Fluent APIで関係を必須に変更します。変更すると、OnModelCreatingが正常に実行されます。

140
Claiton Lovato

ウェブを検索した後

System.Data.Edm.EdmAssociationType::多重度がロールの参照制約と競合しています

それはこの投稿に追いつき続けたので、ここに私の問題と解決策がありました:

Vs efリバースエンジニアリング拡張を使用して、大きなプロジェクトをef4.0からef4.1にアップグレードしました。私たちのmvcアプリはメタデータタイプとパーシャルを使用してef4.0オブジェクトを装飾していました。

メタデータタイプのファイルを削除した後、プロジェクトは機能し始めました。

根本的な問題は[必須]属性でした。これは、ef pocoオブジェクトがnull可能で、メタデータ型が同じプロパティに[必須]であったためです。以前はmvc検証ルールを適用することでしたが、今ではef4.1を使用してナビゲーションプロパティを設定していました。メタデータタイプから[必須]を削除すると、問題が修正されました。

public partial class AgentAgency
{
    public long OID { get; set; }
    public long? AgentOID { get; set; }
    public long? AgencyOID { get; set; }
    public string ReinsuranceYear { get; set; }
    public virtual Agency Agency { get; set; }
    public virtual Agent Agent { get; set; }
}

public class AgentAgencyMetadata
{
    public Int64 OID { get; set; }

    [Required]
    public Int64 AgentOID { get; set; }

    [Required]
    public Int64 AgencyOID { get; set; }
}
4
Leblanc Meneses

マッピングでHasKey()をHasOptional()と組み合わせて使用​​しないようにしてください。私の場合、それがこのエラーの原因でした。

2
ancajic

私はエンティティフレームワークプロジェクトでこのエラーに苦労しました。VenueIdのnull可能な値を変更することで問題を解決しました。

2
lomec