0

J'ai trois modèles ci-dessous First Student ModèleComment ajouter des enregistrement à plusieurs tables dans MVC par EF Repositry

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

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

} 

deuxième classe modèle

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

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

Et le troisième est la classe des étudiants

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; } 
    } 

Et voici mes classes abstraites pour étudiant et classe

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); 
    } 
} 

et dépôt pour les deux classes sont:

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; 
     } 
    } 
} 

et moi pour la classe et la section

<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" /> 

Maintenant, je veux quand nous ajoutons étudiant à la base de données là, je veux sauver à d'autres données à Table Student et informations de classe à la table StudentClass. Comment puis-je le faire??? merci d'avance

+0

Quel est le problème pour créer une méthode qui mettra à jour la table 'Student' et la table' StudentClass'? –

Répondre

0

Ceci est plus une question de modèles de conception et la façon dont vous travaillez. En fonction de vos besoins, la sauvegarde doit être assurée par un service, permet d'appeler le vôtre StudentService.cs

Cela prendra une instance des deux EFClassRepository & EFStudentRepository

Le IStudentService.cs d'interface de service devraient être utilisés par le contrôleur de la page que vous enregistrez et cela devrait appeler save sur le service, qui à son tour prendra n'importe quel objet que vous passez de la page et utilisera ces détails pour appeler une sauvegarde sur les deux dépôts. Donc, comme un exemple rapide:

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); 
     } 
    } 

Interface:

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

Votre modèle contiendrait au minimum l'exigence de holidng l'étudiant et la classe, en supposant que vous ne voulez pas simplement enregistrer une classe vide pour chaque étudiant sans 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; 
     } 
    } 

vous pouvez bien sûr ref que les deux dépôts dans le contrôleur et déposez le service, mais son au sujet de réutilisabilité et vous devriez vraiment pousser que jusqu'à un service à gérer, le contrôleur doit être considéré comme le code derrière la page et être aussi minimal et stupide que possible, laisser la réflexion aux services, présentateurs, etc

Il serait également bon d'obtenir dans l'habitude de rendre vos classes immuables comme ci-dessus, les champs et les propriétés doivent être définis dans le constructeur et les méthodes, pas directement accessibles, aide à structurer l'intégrité du code et à prévenir les changements involontaires.