2

以下をクラスに追加すると、Course3つではなく2つのテーブルしかないため、問題があります

public int PersonId { get; set; }
[ForeignKey("PersonId")]
public virtual Person Student { get; set; }

これらの 3 つの行はすべて適切ではありませんが、クラス Course に追加のフィールドが必要です

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Course> CoursesAttending { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string Title { get; set; }
    public int PersonId { get; set; }

        [ForeignKey("PersonId")]
    public virtual Person Student { get; set; }

    public virtual ICollection<Person> Students { get; set; }
}

public class SchoolContext : DbContext
{
    public DbSet<Course> Courses { get; set; }
    public DbSet<Person> People { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer<SchoolContext>(
                new DropCreateDatabaseAlways<SchoolContext>());

        SchoolContext db = new SchoolContext();
        var cos = from d in db.Courses
                  select d;
    }
}

私を助けてください

4

1 に答える 1

5

EF は、またはを参照しているかどうCourse.Studentかを判断できません。たとえばon 属性を使用して、EF にヒントを与える必要があります。Course.StudentsPerson.CoursesAttending[InverseProperty]Course.Students

[InverseProperty("CoursesAttending")]
public virtual ICollection<Person> Students { get; set; }

編集

このモデルでは、複数のカスケード削除パスが発生します。つまりPerson、結合テーブル内のレコードを削除すると、同様に削除されますが、Courseこの人物がプロパティを通じて割り当てられているすべてのも削除されCourse.Personます。削除されCourseた s は、結合テーブル内のレコードを再度削除します。これは、同じテーブルの 2 番目の削除パスです。

複数のカスケード削除パスは SQL Server では許可されていないため、Fluent API で無効にする必要があります。

public class MyContext : DbContext
{
    //...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Course>()
            .HasRequired(c => c.Student)
            .WithMany()
            .HasForeignKey(c => c.PersonId)
            .WillCascadeOnDelete(false);
    }
}
于 2012-10-01T19:47:39.687 に答える