2014-05-24 1 views
0

나는 그들이 모델EF 코드 첫 많은 업데이트에 많은

public class Doctor 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Fullname { get; set; } 
    public virtual List<Speciality> SelectedSpecialities { get; set; } 
    public virtual List<Speciality> AllSpecialities { get; set; } 
    public virtual List<int> PostedSpecialities { get; set; } 
    public Doctor() 
    { 
     SelectedSpecialities = new List<Speciality>(); 
     PostedSpecialities = new List<int>(); 
    } 
} 

전문 모델

public class Specialty 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Title { get; set; } 
    public virtual List<Doctor> Doctors { get; set; } 
} 
를`와 관련된 많은 - 투 - many`

의사 두 개의 모델을 가지고

나는 또한 많은 관계를 생성하는이 유창한 코드를 가지고있다.

modelBuilder.Entity<Speciality>().HasMany(x => x.Doctors).WithMany(x => x.SelectedSpecialities).Map(x => 
     { 
      x.ToTable("DoctorsSpecialities"); 
      x.MapLeftKey("SpecialityId"); 
      x.MapRightKey("DoctorId"); 
     }); 

내가 Doctor` 잘`추가 할 수 있습니다하지만 난에`Update` 의사의 요리를 시도 할 때 EF 이전 관계를 제거하지 않는 것 같습니다.

나는 (1,2) 및 (1,3)을 가지고 있고이를 (1,1)로 업데이트하려는 경우 (1,2) 및 (1,3) 행을 제거하지 않고 결국 (1,1) (1,2) (1,3)이됩니다.

업데이트 방법

[HttpPost] 
    public ActionResult Add(Doctor m) 
    { 
     if (ModelState.IsValid) 
     { 
      context.Entry(m).State = System.Data.Entity.EntityState.Modified; 
      m.SelectedSpecialities.Clear(); 
      // the line below returns a List<Specialty> of selected pecialties 
      m.SelectedSpecialities = context.Specialities.Where(x => m.PostedSpecialities.Contains(x.Id)).ToList(); 
      context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(); 
    } 
+0

저는 전문가가 아니지만 이전 레코드 [(1,2) 및 (1,3)]을 삭제하고 새 레코드 [(1,1)]를 삽입하거나 코드를 업데이트한다고 말하지는 않습니다 기록 [(1,2)]에서 [(1,1)]. 새 레코드를 삽입하는 코드를 작성하는 중입니다. –

+0

EF는 내 모델을 데이터베이스에 바인딩하여 해당 행을 삭제할 것이라고 생각합니다. 내가 그 행을 내 자신으로 지우고 싶어도 어떻게 쓰는지 모르겠다. – mhesabi

답변

0

문제는 당신의 엔티티 클래스에없는 모든 속성이 가상 것을 사실에 기인한다. 엔티티가 EF 메커니즘에 의해 추적 될 수 있습니다 엔티티 클래스 가상의 모든 속성을함으로써

public class Doctor 
{ 
    public virtual int Id { get; set; } 
    public virtual string Fullname { get; set; } 
    public virtual ICollection<Specialty> SelectedSpecialities { get; set; } 
    public virtual ICollection<Specialty> AllSpecialities { get; set; } 
    public virtual ICollection<int> PostedSpecialities { get; set; } 
} 

public class Specialty 
{ 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual ICollection<Doctor> Doctors { get; set; } 
} 

public ActionResult Add(Doctor m) 
{ 
    if (ModelState.IsValid) 
    { 
     context.Entry(m).State = System.Data.Entity.EntityState.Modified; 
     m.SelectedSpecialities.Clear(); 
     // the line below returns a List<Specialty> of selected pecialties 
     foreach(var speciality in context.Specialties.Where(x => m.PostedSpecialities.Contains(x.Id))) 
     { 
      m.SelectedSpecialities.Add(speciality); 
     } 
     context.SaveChanges(); 
    } 
    return View(); 
} 

을 그들은 당신없이 제대로 탐색 속성 목록을 초기화합니다 : (나를 위해 작동)이을보십시오. 일반적으로 네비게이션 속성의 유형으로 List <을 사용할 수 있지만 클래스는 다른 클래스에 의존해서는 안되며 인터페이스에는 ICollection을 대신 사용하는 것이 좋습니다. 만약 당신이 오직 뷰에서 값을 가져오고 DB에 저장하지 않기 위해서 PostedSpecialities를 사용한다면, DB에 저장되는 프로퍼티와 혼합하는 것이 좋지 않을 것이라고 생각합니다.

관련 문제