CodeFirst EF4.1 MVC レガシーデータベースに対する - 多重度の競合 質問する

CodeFirst EF4.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
            
}

ベストアンサー1

これがまだ間に合うことを願っています。私もまったく同じ問題を抱えていて、間違いに気づくまで 1 時間近くも悩んでいました。

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

public int? VenueId { get; set;}

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

おすすめ記事