0

Ich habe drei Modelle wie unten ersten StudentenWie Rekord

public class Student 
{ 
    public int ID { get; set; } 

    [ForeignKey("account")] 
    public int AccountID { get; set; } 
    public Account account{ get; set; } 
    //some more 

} 

zweite Klasse Modell

public class ClassMigration 
{ 
    public int ID { get; set; } 
    public String Name { get; set; } 

    public bool A { get; set; } 
    //etc 
} 

und die dritte Modell, um mehrere Tabellen in MVC durch EF Repositry hinzuzufügen, ist Student Class

public class StudentClass 
    { 
     public int ID { get; set; } 

     [ForeignKey("student")] 
     public int StudentID { get; set; } 
     public Student student { get; set; } 

     [ForeignKey("clas")] 
     public int ClassID { get; set; } 
     public ClassMigration clas { get; set; } 

     public String Section { get; set; } 

     public String Session { get; set; } 
    } 

Und hier sind meine abstrakten Klassen für Student und Klasse

namespace Domain.Abstract 
{ 
    public interface IStudent 
    { 
     IEnumerable<Student> Students { get; } 
     Student SaveStudent(Student student); 
     Student DeleteStudent(int ID); 
    } 
} 



namespace Domain.Abstract 
{ 
    public interface IClassMigration 
    { 
     IEnumerable<ClassMigration> Classes{ get; } 
     ClassMigration SaveClass(ClassMigration clas); 
     ClassMigration DeleteClass(int ID); 
    } 
} 

Und Repository für beide Klassen sind:

namespace Domain.Concret 
{ 
    public class EFStudentRepository:IStudent 
    { 
     public readonly DbAccess context = new DbAccess(); 

     public IEnumerable<Entities.Student> Students 
     { 
      get { return context.Students; } 
     } 

     public Student SaveStudent(Entities.Student student) 
     { 
      if (student.ID == 0) 
      { 
       Account account = new Account(); 
       account.UserName = student.RegistrationNo; 
       account.Password = "123456"; 
       account.Role = UserRole.Student; 
       context.Accounts.Add(account); 
       context.SaveChanges(); 
       student.AccountID = context.Accounts.Max(m => m.ID); 

       context.Students.Add(student); 
      } 
      else 
      { 
       var org = context.Students.Find(student.ID); 
       if (org != null) 
       { 
        context.Entry(org).CurrentValues.SetValues(student); 
       } 
      } 
      context.SaveChanges(); 
      if(student.ID==0) 
      { 
       student.ID = context.Students.Max(m => m.ID); 
      } 
      return student; 
     } 

     public Entities.Student DeleteStudent(int ID) 
     { 
      var std = context.Students.Find(ID); 
      if (std != null) 
      { 
       context.Students.Remove(std); 
       context.SaveChanges(); 
      } 
      return std; 
     } 
    } 
} 



namespace Domain.Concret 
{ 
    public class EFClassRepository:IClassMigration 
    { 
     public DbAccess context = new DbAccess(); 
     public IEnumerable<Entities.ClassMigration> Classes 
     { 
      get { return context.Classes; } 
     } 

     public Entities.ClassMigration SaveClass(Entities.ClassMigration clas) 
     { 
      if (clas.ID == 0) 
      { 

       context.Classes.Add(clas); 
      } 
      else 
      { 
       var org = context.Classes.Find(clas.ID); 
       if (org != null) 
       { 
        context.Entry(org).CurrentValues.SetValues(clas); 
       } 
      } 
      context.SaveChanges(); 
      if (clas.ID == 0) 
      { 
       clas.ID = context.Classes.Max(m => m.ID); 
      } 
      return clas; 
     } 

     public Entities.ClassMigration DeleteClass(int ID) 
     { 
      var clas = context.Classes.Find(ID); 
      if (clas != null) 
      { 
       context.Classes.Remove(clas); 
       context.SaveChanges(); 
      } 
      return clas; 
     } 
    } 
} 

und meiner Meinung nach für die Klasse und Abschnitt

<div class="form-group"> 
         <label for="Class">Class</label> 
         @Html.DropDownList("Class", @ViewBag.Classes as SelectList, new { @class = "form-control" }) 
        </div> 
        <div class="form-group"> 
         <label for="Section">Select Section</label> 
         <select id="Section" class="form-control"> 
          <option selected="selected" value="A">A</option> 
          <option value="B">B</option> 
          <option value="C">C</option> 
          <option value="D">D</option> 
          <option value="E">E</option> 
          <option value="F">F</option> 
         </select> 
        </div> 
        <div class="form-group"> 
         <label for="FatherName">Father Name</label> 
         <input type="text" class="form-control" id="FatherName" placeholder="Father Name" /> 

Jetzt möchte ich, wenn wir Schüler Datenbank hinzufügen, dass es ich speichern möchten zu anderen Daten zu Student-Tabelle und Klasseninformationen zu StudentClass-Tabelle. wie kann ich es tun??? Danke im Voraus

+0

Was ist das Problem, eine Methode zu erstellen, die sowohl 'Student'-Tabelle als auch' StudentClass'-Tabelle aktualisiert? –

Antwort

0

Dies ist eher eine Frage der Designmuster und der Art, wie Sie arbeiten. Ihre Bedürfnisse Je nach, die von einem Dienst behandelt werden sparen sollten, können StudentService.cs Anruf Ihr

Dies wird

Die Service-Schnittstelle IStudentService.cs eine Instanz der beiden EFClassRepository & EFStudentRepository nehmen sollte verwendet werden, den Controller der Seite, auf der Sie speichern, und dies sollte den Dienst "save" aufrufen, der wiederum das Objekt übernimmt, das Sie von der Seite übergeben, und diese Details verwenden, um eine Sicherung für beide Repositorys aufzurufen. So wie ein kurzes Beispiel:

public class StudentService : IStudentService 
    { 

     private readonly IStudentRepository studentRepository; 
     private readonly IClassRepository classRepository; 

     public StudentService(IStudentRepository studentRepository, IClassRepository classRepository) 
     { 
      if (studentRepository == null) throw new ArgumentNullException(nameof(studentRepository)); 
      if (classRepository == null) throw new ArgumentNullException(nameof(classRepository)); 

      this.studentRepository = studentRepository; 
      this.classRepository = classRepository; 
     } 

     public void Save(Student student, Class studentsClass) 
     { 
      if (student == null) throw new ArgumentNullException(nameof(student)); 
      if (studentsClass == null) throw new ArgumentNullException(nameof(studentsClass)); 

      studentRepository.Save(student); 
      classRepository.Save(studentsClass); 
     } 
    } 

Schnittstelle:

interface IStudentService 
    { 
     void Save(Student student, Class studentsClass); 
    } 

Ihr Modell bei min die Forderung nach holidng der Schüler und Klasse enthalten würde, vorausgesetzt, Sie nicht wollen, eine leere Klasse für jeden Schüler nur sparen ohne Info:

public class StudentPageModel 
    { 
     public int SchoolYear { get; private set; } 
     public Student Student { get; private set; } 

     public Class Class { get; private set; } 

     public StudentPageModel(int schoolYear, Student student, Class studentClass) 
     { 
      SchoolYear = schoolYear; 
      Student = student; 
      Class = studentClass; 
     } 
    } 

Sie natürlich konnte ref nur beide Repositories innerhalb der Steuerung und legen Sie die Service, aber es geht um die Wiederverwendbarkeit und Sie sollten wirklich, dass Push-up zu ein Service zu behandeln, muss der Controller als der Code hinter der Seite angesehen werden und so minimal und dumm wie möglich sein, lassen Sie das Denken zu den Diensten, Referenten, etc.

Es wäre auch gut zu bekommen In der Angewohnheit, Ihre Klassen wie oben unveränderlich zu machen, sollten Felder und Eigenschaften im Konstruktor und in den Methoden festgelegt werden, auf die nicht direkt zugegriffen wird, die Code-Integrität strukturieren und unbeabsichtigte Änderungen verhindern.