0

개체를 만드는 데 문제가 있습니다. 내 엔티티는 "계층 적"일대 다 관계를 가지고 있습니다. 부서는 다른 부서에 속할 수 있습니다. 여기 MVC4, EF : "계층 적"일대 다 관계로 새 개체를 만듭니다.

//Properties 
    [Key] 
    [Column(Order = 0)] 
    public int DivisionId { get; set; } 

    [Required] 
    [MaxLength(30)] 
    [Column("DivisionName", Order = 2)] 
    public string Name { get; set; } 

    //Navigation properties 
    public virtual Division ParentDivision { get; set; } 

새로운 부문 만드는 내 방법 : 여기 내 실체 내가 다른 부문에 속한 사업부를 만들 때이 경우

public ActionResult Create() 
    { 
     ViewBag.ParentDivision = new SelectList(db.Divisions, "DivisionId", "Name"); 
     return View(); 
    } 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Division division) 
    {    
     if (ModelState.IsValid) 
     { 
      db.Divisions.Add(division); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.ParentDivision = new SelectList(db.Divisions, "DivisionId", "Name", division.ParentDivision.DivisionId); 
     return View(division); 
    } 

을, 내가 얻을 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다." 오류. 객체가 생성되고, 여기에

ViewBag.ParentDivision = new SelectList(db.Divisions, "ParentDivision.DivisionId", "Name", division.ParentDivision.DivisionId); 

을하지만, 부모 부문 않고 ...

은 정말 혼란 스러워요 ... :

나는 또한이 같은 ViewBag을 변경하려고했습니다 누군가가 어떤 생각을 가지고 있다면 ... 미리 감사드립니다.

+0

"순환"이란 의미입니까? 즉 Division A는 A를 소유 한 B를 소유하고 있습니까? 아니면 "계층 적"을 의미합니까? A는 B, C, D를 소유합니다. C는 E, F 등을 소유하고 있지만 A로 되돌아 오지는 않습니까? –

+0

@AdamBenson 예, 죄송 합니다만, 말하자면 계층 적이기 때문에 원형이 아닙니다. 감사합니다. – Pookye

답변

0

이것은 자체 참조 관계라는 사실과 아무 관련이 없습니다. ParentDivision이 아직 설정되지 않은 경우 null이되고 null은 DivisionId 속성이 없으므로 예외가됩니다.

속성을 참조하기 전에 Null 검사를 수행해야합니다. 아마이 경우에 가장 쉬운 방법은 원을 사용하는 것입니다 :

division.ParentDivision != null ? division.ParentDivision.DivisionId : null 

그러나 어쨌든, 선택된 값을 설정할 필요가 없습니다. Razer가 자동으로 처리합니다. 실제 SelectList도 만들 필요가 없습니다. Html.DropDownListFor의 모든 요구 사항은 IEnumerable<SelectListItem>입니다. 이것을 전달하면 도우미가 SelectList을 만들고 적절한 경우 선택한 값을 설정합니다. 그런 다음

ViewBag.ParentDivision = db.Divisions.Select(m => new SelectListItem { Value = m.DivisionId, Text = m.Name }); 

:

또 다른 문제를 불러옵니다
@Html.DropDownListFor(m => m.ParentDivisionId, (IEnumerable<SelectListItem>)ViewBag.ParentDivision) 

. 현재 실제로 바인딩 할 속성이 없습니다. 선택 목록은 전체 ParentDivision 인스턴스가 아닌 ID 만 게시하기 때문에 ParentDivision을 직접 사용할 수 없습니다. 게시 된 ID를 바인딩 할 속성이 필요합니다. 실제로 엔터티에 포함하는 것이 좋습니다.

[ForeignKey("ParentDivision")] 
public int ParentDivisionId { get; set; } 
public virtual Division ParentDivision { get; set; } 
+0

대단히 감사합니다 !! 실제로 나는 모든 엔티티를 삭제하고 마지막 포인트를 고려하여 리디스했습니다. 또한 컬렉션을 추가했으며 데이터베이스를 업데이트 할 때 생성 된 테이블의 차이를 확인했습니다. – Pookye