0

私はモデルはEFリポジトリを通じてMVCで複数のテーブルにレコードを追加する方法

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 
} 

そして第三に1 まず学生以下のような三つのモデルを持っている学生クラス

です
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

これは設計パターンと作業の方法の問題です。 は、必要に応じて、サービスによって処理されなければならないセーブ、これは両方のEFClassRepository & EFStudentRepository

サービスインターフェイスIStudentService.csのインスタンスを取る

コールあなたStudentService.csがで使用されなければならないことができます保存しているページのコントローラで、これはサービス上のsaveを呼び出す必要があります。これは、ページから渡すオブジェクトをすべて受け取り、それらの詳細を使用して両方のリポジトリの保存を呼び出します。だから、簡単な例として:

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

もちろん、単にコントローラ内の両方のリポジトリをREFとサービスが、その程度再利用性をドロップすると、あなたは本当にすることを押し上げなければならない可能性があり処理するサービス、コントローラはページのコードの背後にあると見なされ、可能な限り最小限でダムである必要があり、サービス、プレゼンターなどに考えを残す必要があります。

また、上記のようにクラスを不変にする習慣に、フィールドとプロパティをコンストラクタに設定し、直接アクセスするのではなく、コードの完全性を構造化し、意図しない変更を防ぐのに役立ちます。

関連する問題