0

ViewModel を使用して複数のエンティティにデータを保存および更新する方法について誰か助けてもらえますか?

次のようなViewModelがあります。

  public class StudentViewModel
  {
    public Student student;
    public StudentAddress studentAddress { get; set; }
    public StudentPhoto studentPhoto { get; set; }
    // Three entities are related to one to one relationship

    public DoctorDetailsViewModel()
    { }

    }

私のコントローラーは:

  [HttpPost]
    public ActionResult Create(StudentViewModel studentViewModel)
    {
        if (ModelState.IsValid)
        {
            return View(studentViewModel);
        }

            Student s = new Student()
             {
                 Name =studentViewModel.Student.Name,
                 Speciality = studentViewModel.Student.Speciality,
                 DateOfJoinig = studentViewModel.Student.DateOfJoinig,
                 Qualification = studentViewModel.Student.Qualification,
                 Email = studentViewModel.Student.Email

             };

            StudentAddress sa = new StudentAddress()
            {
                StudentId= studentViewModel.Student.StudentId,
                Address = studentViewModel.StudentAddress.Address,
                Area = studentViewModell.StudentAddress.Area,
                City = studentViewModel.StudentAddress.City,
                State = studentViewModel.StudentAddress.State,
                Pincode = studentViewModel.StudentAddress.Pincode,
                Phone = studentViewModel.StudentAddress.Phone,
                Mobile = studentViewModel.StudentAddress.Mobile

            };

            StudentPhoto sp = new StudentPhoto()
            {
                StudentId= studentViewModel.Student.StudentId,
                Photo = studentViewModel.StudentPhoto.Photo

            };    
            db.Students.Add(s);
            db.StudentAddress.Add(sa);
            db.StudentPhoto.Add(sp);

            db.SaveChanges();
            return RedirectToAction("Home");
    }

(複数のエンティティから) データを取得してビューに表示することができました。ただし、上記のエンティティを新しいデータで保存および更新する方法に行き詰まっています。ほとんどの例は 1 対 1 の関係であり、マッピングは自動的に行われますが、この場合、データは複数のエンティティに属しています。

これを行う最善の方法は何ですか?ありがとう。

4

3 に答える 3

2

まず、モデルは次のようになります。

public class Student
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int StudentID { get; set; }

    public string Speciality { get; set; }

    public DateTime DateOfJoinig { get; set; }

    public string Qualification { get; set; }

    public string Email { get; set; }
}

public class StudentAddress
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int StudentAddressID { get; set; }

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

    public virtual Student Student { get; set; }

    public string Address { get; set; }

    public string Area { get; set; }

    public string City { get; set; }

    public string State { get; set; }

    public string Pincode { get; set; }

    public string Phone { get; set; }

    public string Mobile { get; set; }
}

public class StudentPhoto
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int StudentPhotoID { get; set; }

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

    public virtual Student Student { get; set; }

    public string Photo { get; set; }
}

Qazi が述べたように、ナビゲーション プロパティが必要です。次に、クライアント側で、編集目的で ID プロパティの非表示フィールドを用意する必要があります。

@Html.HiddenFor(s => s.StudentID)

その後、コントローラーメソッドは次のようになります。

    [HttpPost]
    public ActionResult Create(StudentViewModel studentViewModel)
    {
        if (!ModelState.IsValid)
        {
            return View(studentViewModel);
        }

        studentViewModel.StudentAddress.Student = studentViewModel.Student;
        studentViewModel.StudentPhoto.Student = studentViewModel.Student;
        if (studentViewModel.Student.StudentID > 0)
            db.Students.Attach(studentViewModel.Student);
        else
            db.Students.Add(studentViewModel.Student);
        db.SaveChanges();
        return RedirectToAction("Home");
    }

ID プロパティを割り当てる必要はありませんが、ナビゲーション プロパティを割り当てる必要があります。

于 2016-04-19T08:46:56.413 に答える
0

リレーショナル データベースを使用している間、StudentAddress テーブルと StudentPhoto テーブルの両方の StudentId 外部キーによってコードに示されているように、studentaddress が Student の子になることを理解しています。Student にナビゲーション プロパティを追加し、これらのプロパティに住所と写真を割り当てると、エンティティ フレームワークはそれらを保存します。何かのようなもの

Student s = new Student {...}
s.StudentAddress = new StudentAddress {...}
s.StudentPhoto = new StudentPhoto {...}

db.Students.Add (s);
db.SaveChanges();
于 2014-08-05T22:08:19.437 に答える
0

テストされていませんが、これは役立つかもしれません

[HttpPost]
public ActionResult Create(StudentViewModel studentViewModel)
{
    if (!ModelState.IsValid) // added ! so that you can do something if it is valid other than redisplay the Create View with the model 
    {
        return View(studentViewModel);
    }

        Student s = new Student()
         {
             Name =studentViewModel.Student.Name,
             Speciality = studentViewModel.Student.Speciality,
             DateOfJoinig = studentViewModel.Student.DateOfJoinig,
             Qualification = studentViewModel.Student.Qualification,
             Email = studentViewModel.Student.Email

         };

         db.Students.Add(s);
         db.SaveChanges(); // Post the changes with the student and save changes so you have the correct studentId PrimaryKey value from the database. Note: EF should update your object with the correct Id on SaveChanges() 

        StudentAddress sa = new StudentAddress()
        {
            StudentId= studentViewModel.Student.StudentId,
            Address = studentViewModel.StudentAddress.Address,
            Area = studentViewModell.StudentAddress.Area,
            City = studentViewModel.StudentAddress.City,
            State = studentViewModel.StudentAddress.State,
            Pincode = studentViewModel.StudentAddress.Pincode,
            Phone = studentViewModel.StudentAddress.Phone,
            Mobile = studentViewModel.StudentAddress.Mobile

        };

        StudentPhoto sp = new StudentPhoto()
        {
            StudentId= studentViewModel.Student.StudentId,
            Photo = studentViewModel.StudentPhoto.Photo

        };    
        // don't add it again!  db.Students.Add(s);
        db.StudentAddress.Add(sa);
        db.StudentPhoto.Add(sp);

        db.SaveChanges();
        return RedirectToAction("Home");
}
于 2013-09-26T18:49:44.583 に答える