在 Entity Framework 中添加列 6.1 - 多对多 - Code First
Adding column in Entity Framework 6.1 - Many-To-Many - Code First
举个例子,我在 codeproject 上使用这篇文章中的代码:http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First
我想在我的代码中做类似的事情,但我也想要一个数量 属性,所以:
- 一个课程可以有很多人
- 一个人可以拥有多门课程
- 每个人可以选择每门课程的数量。 (我知道两次选择相同的课程没有意义,但这只是一个例子,或者用汉堡包类型替换课程:-))
我想我必须在 PersonCourses table 中添加一个名为 Quantity 的列,但我不知道如何在 Code First 中做到这一点。
代码:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Course> CoursesAttending { get; set; }
public Person()
{
CoursesAttending = new HashSet<Course>();
}
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public ICollection<Person> Students { get; set; }
public Course()
{
Students = new HashSet<Person>();
}
}
public class SchoolContext : DbContext
{
public DbSet<Course> Courses { get; set; }
public DbSet<Person> People { get; set; }
public SchoolContext()
: base("MyDb")
{
}
}
上下文:
public class SchoolContext : DbContext
{
public DbSet<Course> Courses { get; set; }
public DbSet<Person> People { get; set; }
public SchoolContext()
: base("MyDb")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().
HasMany(c => c.Students).
WithMany(p => p.CoursesAttending).
Map(
m =>
{
m.MapLeftKey("CourseId");
m.MapRightKey("PersonId");
m.ToTable("PersonCourses");
});
}
}
正如您所见,您的模型中没有 PersonCourses table,因为您使用了 EF 多对多功能(EF 将自行创建)。如果您想向 PersonCourses table 添加一些自己的列,则不应使用 EF 多对多功能,而应使用两个一对多功能。
像这样更改您的模型:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<PersonCourse> PersonCourses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public ICollection<PersonCourse> PersonCoursess { get; set; }
}
public class PersonCourse {
[Key, Column(Order = 0)]
public int PersonId { get; set; }
[Key, Column(Order = 1)]
public int CourseId { get; set; }
public int Quantity { get; set; }
public Person Person { get; set; }
public Course Course { get; set; }
}
要将列添加到联结 table,您需要将其显式映射为实体并创建两个一对多关系:
public class PersonCourse
{
[Key, Column(Order = 0),ForeignKey("Person")]
public int PersonId { get; set; }
[Key, Column(Order = 1),ForeignKey("Course")]
public int CourseId { get; set; }
public Person Person { get; set; }
public Course Course { get; set; }
public int Quantity{ get; set; }
}
public class Person
{
public int PersonId { get; set; }
//...
public ICollection<PersonCourse> CoursesAttending { get; set; }
public Person()
{
CoursesAttending = new HashSet<PersonCourse>();
}
}
public class Course
{
public int CourseId { get; set; }
//...
public ICollection<PersonCourse> Students { get; set; }
public Course()
{
Students = new HashSet<PersonCourse>();
}
}
如果您想使用 Fluent Api 而不是 Data Annotations,您可以使用这些配置:
modelBuilder.Entity<PersonCourse>().HasKey(pc => new { pc.PersonId, pc.CourseId});
modelBuilder.Entity<PersonCourse>().HasRequired(pc=>pc.Person).WithMany(p=>p.CoursesAttending).HasForeignKey(pc=>pc.PersonId);
modelBuilder.Entity<PersonCourse>().HasRequired(pc=>pc.Course).WithMany(c=>c.Students).HasForeignKey(pc=>pc.CourseId);
举个例子,我在 codeproject 上使用这篇文章中的代码:http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First
我想在我的代码中做类似的事情,但我也想要一个数量 属性,所以:
- 一个课程可以有很多人
- 一个人可以拥有多门课程
- 每个人可以选择每门课程的数量。 (我知道两次选择相同的课程没有意义,但这只是一个例子,或者用汉堡包类型替换课程:-))
我想我必须在 PersonCourses table 中添加一个名为 Quantity 的列,但我不知道如何在 Code First 中做到这一点。
代码:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Course> CoursesAttending { get; set; }
public Person()
{
CoursesAttending = new HashSet<Course>();
}
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public ICollection<Person> Students { get; set; }
public Course()
{
Students = new HashSet<Person>();
}
}
public class SchoolContext : DbContext
{
public DbSet<Course> Courses { get; set; }
public DbSet<Person> People { get; set; }
public SchoolContext()
: base("MyDb")
{
}
}
上下文:
public class SchoolContext : DbContext
{
public DbSet<Course> Courses { get; set; }
public DbSet<Person> People { get; set; }
public SchoolContext()
: base("MyDb")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().
HasMany(c => c.Students).
WithMany(p => p.CoursesAttending).
Map(
m =>
{
m.MapLeftKey("CourseId");
m.MapRightKey("PersonId");
m.ToTable("PersonCourses");
});
}
}
正如您所见,您的模型中没有 PersonCourses table,因为您使用了 EF 多对多功能(EF 将自行创建)。如果您想向 PersonCourses table 添加一些自己的列,则不应使用 EF 多对多功能,而应使用两个一对多功能。
像这样更改您的模型:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<PersonCourse> PersonCourses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public ICollection<PersonCourse> PersonCoursess { get; set; }
}
public class PersonCourse {
[Key, Column(Order = 0)]
public int PersonId { get; set; }
[Key, Column(Order = 1)]
public int CourseId { get; set; }
public int Quantity { get; set; }
public Person Person { get; set; }
public Course Course { get; set; }
}
要将列添加到联结 table,您需要将其显式映射为实体并创建两个一对多关系:
public class PersonCourse
{
[Key, Column(Order = 0),ForeignKey("Person")]
public int PersonId { get; set; }
[Key, Column(Order = 1),ForeignKey("Course")]
public int CourseId { get; set; }
public Person Person { get; set; }
public Course Course { get; set; }
public int Quantity{ get; set; }
}
public class Person
{
public int PersonId { get; set; }
//...
public ICollection<PersonCourse> CoursesAttending { get; set; }
public Person()
{
CoursesAttending = new HashSet<PersonCourse>();
}
}
public class Course
{
public int CourseId { get; set; }
//...
public ICollection<PersonCourse> Students { get; set; }
public Course()
{
Students = new HashSet<PersonCourse>();
}
}
如果您想使用 Fluent Api 而不是 Data Annotations,您可以使用这些配置:
modelBuilder.Entity<PersonCourse>().HasKey(pc => new { pc.PersonId, pc.CourseId});
modelBuilder.Entity<PersonCourse>().HasRequired(pc=>pc.Person).WithMany(p=>p.CoursesAttending).HasForeignKey(pc=>pc.PersonId);
modelBuilder.Entity<PersonCourse>().HasRequired(pc=>pc.Course).WithMany(c=>c.Students).HasForeignKey(pc=>pc.CourseId);