EF4 Отображение один-ко-многим в существующей базе данных без навигации - PullRequest
3 голосов
/ 09 августа 2010

Я использую 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 и существующей базой данных?

1 Ответ

1 голос
/ 16 ноября 2010

Предполагается, что ему нужна таблица соединения (и, следовательно, ее поиск), потому что вы не сопоставили свойство в исходном объявлении.

Попробуйте вручную отобразить свойства в реальной таблице, как показано ниже.

public class Meeting {
        public int MeetingID { get; set; }
        public int CourseID { get; set; }
        public DateTime MeetDate { get; set; }

        public Course { get; set; }
}

, а затем настройте его следующим образом:

modelBuilder.Entity<Meeting>(m => new {
        MeetingId = m.Meeting,
        MeetDate = m.MeetDate,
        CourseId = m.Course.Id
})
.HasRequired(m => m.Course)
.WithMany()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...