2013-03-26 5 views
5

Ich habe das folgende einfache Modell, das in Code First Ansatz implementiert wird. Abteilung und Kurse haben eins zu viele Beziehung. Eine Abteilung kann viele Kurse haben, während ein Kurs genau einer Abteilung angehören kann. Hier ist das Modell.Eins-zu-viele Beziehung Seeding in Code First

public class Department 
{ 
    public int DepartmentId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 
     } 

public class Course 
{ 
    public int CourseId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public int DepartmentId { get; set; } 
    public virtual Department Department { get; set; } 

}

Mein Problem ist, ich möchte, dass sie Samen. Ich möchte mindestens 5 Werte in meiner Seed-Funktion. Hier ist die Seed-Funktion.

public class DataInitializer : DropCreateDatabaseIfModelChanges<StudentRecordContext> 
{ 
    protected override void Seed(StudentRecordContext context) 
{ 
    var departments = new List<Department> 
    { 
     new Department { DepartmentId = 1, Title = "English", Description ="English  Department", Courses = new List<Course>() }, 
     new Department { DepartmentId= 2,Title = "Chemistry", Description ="chemistry department", Courses = new List<Course>() }, 
     new Department { DepartmentId= 3,Title = "Mahematics", Description ="mathematics department", Courses = new List<Course>() }, 
     new Department { DepartmentId= 4,Title = "Philosophy", Description ="philosophy department", Courses = new List<Course>() }, 
     new Department { DepartmentId= 5,Title = "Biology",  Description ="biology department", Courses = new List<Course>() } 
    };               
    departments.ForEach(t => context.Departments.Add(t)); 
    context.SaveChanges(); 


    var courses = new List<Course> 
    { 
     new Course { CourseId = 1055, Title = "Classic English", Description = "Some  Description", DepartmentId = 1 }, 
     new Course { CourseId = 2055, Title = "Applied Chemistry", Description = "Some Description", DepartmentId = 2 }, 
     new Course { CourseId = 2056, Title = "Applied Mathematics", Description = "Some Description", DepartmentId = 3 }, 
     new Course { CourseId = 3041, Title = "MetaPhysics", Description = "Some Description", DepartmentId = 4 }, 
     new Course { CourseId = 3024, Title = "Molecular Biology", Description = "Some Description", DepartmentId = 5 }, 
    }; 
    courses.ForEach(t => context.Courses.Add(t)); 
    context.SaveChanges(); 

aber das funktioniert nicht. Ich bin neu in EF und Code First ... und Deadlines voraus ... Kann mir bitte jemand helfen, was die richtige Art ist, die DB zu seeden.

+0

http://dehsanghanbari.com/Post/6/getting-started-with-entity-framework – Ehsan

Antwort

0

Da Sie die Primärschlüssel selbst generieren, Sie benötigen [DatabaseGenerated(DatabaseGenerationOption.None)] Attribut für courseid und DepartmentId setzen, so dass Entity Framework wird wissen, dass Sie die Schlüssel sind zu generieren.

Eine bessere Möglichkeit wäre, auf der EntityFramework für die Primärschlüssel zu halten verlassen, aber in diesem führen, dass Sie und müssen, um die Kurse zu speichern und da Sie assoziieren die Abteilung leicht Ihre Methode

var courses = new List<Course> 
     { 
      new Course {Title = "Classic English", Description = "Some  Description", Department= 
    new Department { Title = "English", Description ="English  
Department", Courses = new List<Course>() }}, 
      ..... 
     }; 
     courses.ForEach(t => context.Courses.Add(t)); 

zu ändern Es wird implizit gespeichert.

Viel Glück mit Ihrer Deadline!

3

Setzen Sie keine Primärschlüssel in der Seed() Methode. Entity Framework weiß, dass Eigenschaften mit der ID im Namen Primärschlüssel sind.

die folgend in Ihrer Seed() Methode versuchen:

protected override void Seed(StudentRecordContext context) 
{ 
    var departments = new List<Department> 
    { 
     // this will have DepartmentId = 1 
     new Department { Title = "English", Description ="English Department", Courses = new List<Course>() }, 
     // more departments 
    }; 
    departments.ForEach(d => context.Departments.Add(d)); 
    context.SaveChanges(); 

    var courses = new List<Course> 
    { 
     // this will have CourseId = 1 
     new Course { Title = "Classic English", Description = "Some Description", Department = departments.FirstOrDefault(d => d.DepartmentId == 1) }, 
     // this will have CourseId = 2 
     new Course { Title = "Drama", Description = "Some Description", Department = departments.FirstOrDefault(d => d.DepartmentId == 1) }, 
     // both of the above courses will be added to Department with DepartmentId = 1 
     // more courses 
    }; 
    courses.ForEach(c => context.Courses.Add(c)); 
    context.SaveChanges(); 

    // now add the two courses to the department 
    departments[0].Courses.Add(courses[0]); // in list departments at index 0 add course from list courses at index 0 
    departments[0].Courses.Add(courses[1]); // in list departments at index 0 add course from list courses at index 1 
    context.SaveChanges(); 
} 
+0

Haben Sie versucht, den obigen Code zu verwenden? Hat es dein Problem gelöst? – MattSull

+0

Ich hatte das gleiche Problem und diese Arbeit wie ein Zauber für mich. – tonyedwardspz

+0

Ihre Antwort hat mir geholfen, aber bitte sehen Sie meine Antwort unten für eine einfachere Lösung –

0

Hier ist, wie ich es tun, Sie müssen nur die ‚Kinder‘ vor den ‚Eltern‘ initialisieren, keine Savechanges() benötigt:

var choices = new List<Choices> 
{ 
    new Choices { Description = "Choice1" }, 
    new Choices { Description = "Choice2" }, 
    new Choices { Description = "Choice3" }, 
    new Choices { Description = "Choice4" } 
}; 

choices.ForEach(c => context.Choices.AddOrUpdate(c)); 

context.Questions.AddOrUpdate(
    p => p.ID, 
    new Question { QuestionText = "Question ?", Choices = choices } 
    ); 
Verwandte Themen