0

У меня есть три модели, как ниже First Student ModelКак добавить запись к нескольким таблицам в MVC через EF Repositry

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

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

} 

второго класса Модель

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

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

И третий является студент класса

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

И вот мои абстрактные классы для учащихся и классов

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

И хранилище для обоих классов:

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

и мой взгляд на класс и секции

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

Теперь я хочу, когда мы добавляем студента в базу данных там я хочу, чтобы сохранить к другим данным в таблицу Student и информацию о классе в таблицу StudentClass. как мне это сделать??? заранее спасибо

+0

В чем проблема с созданием метода, который будет обновлять таблицу 'Student' и' StudentClass'? –

ответ

0

Это больше вопрос о шаблонах дизайна и о том, как вы работаете. В зависимости от ваших потребностей, сохранения должны быть обработаны с помощью сервиса, позволяет ваш звонок StudentService.cs

Это будет принимать экземпляр обоих интерфейсов IStudentService.cs

Службы EFClassRepository & EFStudentRepository должны использоваться контроллер страницы, которую вы сохраняете, и это должно вызвать сохранение в службе, которая, в свою очередь, будет принимать любой объект, который вы передаете со страницы, и использовать эти данные для вызова сохранения в обоих хранилищах. Так как быстрый пример:

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 IStudentService 
    { 
     void Save(Student student, Class studentsClass); 
    } 

Ваша модель будет содержать в мин требования для holidng ученика и класса, если вы не хотите просто сохранить пустой класс для каждого студента без какой-либо информации:

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

Можно, конечно, просто реф как хранилищ внутри контроллера и уронить услугу, но его о повторном использовании, и вы должны действительно подтолкнуть, что до сервис для обработки, контроллер должен рассматриваться как код позади страницы и быть как можно более минимальным и немым, оставлять мышление для служб, презентаторов и т. д.

Было бы также полезно получить в привычку делать свои классы неизменными, как указано выше, поля и свойства должны быть заданы в конструкторе и методах, которые не доступны напрямую, помогает структурировать целостность кода и предотвращать непреднамеренные изменения.