Я использую ModelBuilder для сопоставления существующей базы данных с POCO. У меня есть курсы, студенты и встречи. Вот таблицы
CREATE TABLE Courses (
CourseID int,
Name string)
CREATE TABLE Students(
StudentID int,
Name string)
CREATE TABLE Courses_Students (
CourseID int,
StudentID int)
CREATE TABLE Meetings (
MeetingID int,
CourseID int,
MeetDate datetime)
И РОС
public class Course {
public int CourseID { get; set; }
public string Name { get; set; }
public virtual ICollection<CourseMeeting> Meetings { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
public class Student {
public int StudentID { get; set; }
public string Name { get; set; }
}
public class Meeting {
public int MeetingID { get; set; }
public int CourseID { get; set; }
public DateTime MeetDate { get; set; }
}
Отображение таблицы отлично работает:
modelBuilder.Entity<Course>().MapSingleType().ToTable("Courses");
modelBuilder.Entity<Student>().MapSingleType().ToTable("Students");
modelBuilder.Entity<Meeting>().MapSingleType().ToTable("Meetings");
И сопоставление «многие ко многим» с таблицей соединений и без свойства навигации работает (т. Е. Свойство Students.Courses не указано в WithMany()
)
modelBuilder.Entity<Course>()
.HasMany(c => c.Students)
.WithMany()
.Map(StoreTableName.FromString("Courses_Students"),
(c, s) => new { CourseID = c.CourseID, StudentID = s.StudentID});
Но у меня проблемы с отображением других отношений, у которых нет таблицы соединений. Это явно не правильно:
modelBuilder.Entity<Course>().HasMany(c => c.Meetings).WithMany();
Потому что ему нужна таблица соединений: Invalid object name 'dbo.Course_Meetings'
. Я могу добавить свойство Course
к объекту Meeting
и затем использовать
modelBuilder.Entity<Course>()
.HasMany(c => c.Meetings)
.WithOptional(m => m.Course)
.HasConstraint((c, m) => c.CoursID == me.CourseID);
Но я бы хотел сделать это без свойства навигации. Возможно ли это с EF4 и существующей базой данных?