0

나는 이곳 저곳을 수색 해왔고 많은 질문을 발견했지만 그들 중 누구도 대답하지 못했습니다.EF 특정 부모에게 자녀 삽입

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

    public List<Child> Children { get; set; } 
} 

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

    public int ParentID { get; set; } 
    public Parent Parent { get; set; } 
} 

EF가 DB를 생성을 담당하고 비계를 통해 내가 컨트롤러와 뷰를 얻을 : 내가 할 노력하고 있어요

것은 간단, 이제 우리는 그런 일이 있다고 가정 해 보자. 모든 것이 잘 작동하고 부모를 만들 수 있습니다. 드롭 다운에서 선택한 ParentID가있는 하위를 만들 수도 있습니다. 우리가이있어

public IActionResult Create(int id) 
    { 
     if (id == 0) 
     { 
      return NotFound(); 
     } 

     ViewData["ID"] = id; //that a ParentID 
     return View(); 
    } 

그리고보기 : 내가 정말로 원하는 무엇

그런 매개 변수로 ParentID 드롭 다운 제거하고 통과입니다

<form asp-action="Create"> 
    <div class="form-horizontal"> 
     <h4>Child</h4> 
     <hr /> 
     <div asp-validation-summary="ModelOnly" class="text-danger"></div> 
     <input type="hidden" asp-for="ParentID" [email protected]["ID"] /> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
</form> 

"내가 가진이 없습니다 제출 IDENTITY_INSERT가 OFF로 설정된 경우 'Children'테이블의 ID 열에 대해 명시 적 값을 삽입하십시오. " 지금 나는 그 장소 전체를 들여다 보았고 여러 가지 특성을 시도했지만 여전히 이것을 작동시킬 수는 없다.

나는 모든 종류의 도움에 감사드립니다.


업데이트

하는 컨트롤러의 방법을 만들기 :

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child) 
    { 
     if (ModelState.IsValid) 
     { 
      _context.Add(child); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     return View(book); 
    } 

그냥 문제에 대한 자세한 내용을 표시합니다. 여기서는 선택 컨트롤이있는 기본 스캐 폴드 버전을 사용하고 있습니다.

public IActionResult Create(int id) 
    { 
     if (id == 0) 
     { 
      return NotFound(); 
     } 

     ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == 1), "ID", "ID"); //Works 
     ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == id), "ID", "ID"); // Doesn't work 
     return View(); 
    } 
+0

실제'Child' 객체를 구성하는 코드를 게시 할 수 있습니까? 이 오류는 EF가 ID 열로 표시 한 필드의 값을 명시 적으로 설정하려고 시도하고 있음을 나타냅니다. Scaffolded가 틀린 것이 아니라면,'ParentID'는'Child'의'Identity' 컬럼이되어서는 안됩니다. –

+0

@ stephen.vakil 응답 해 주셔서 감사합니다. 내일 일하게 될 것이고 나는 그것을 게시 할 수있을 것입니다. 내가 보여준 것과는 다른 것을 바꾸지 마라. 이 줄에서 "_context.SaveChangesAsync(); await"예외가 발생합니다. – Bielik

+0

양식 안의보기에 숨겨진 것으로 parentID를 저장하면 게시물과 함께 반환됩니다 – Monah

답변

0

의견에있는 사람들과 이야기 후 나는 그 문제는 EF 코어의 버그로 인해 발생 생각하기 시작하지만 난 주위에 '더러운'일을 발견했다 생각합니다. 여기

는 하위 모델이다 ". IDENTITY_INSERT가 OFF로 설정되어있을 때 테이블 '어린이'의 ID 열에 명시 적 값을 삽입 할 수 없습니다"

public class Child 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ParentID { get; set; } 
    [ForeignKey("ParentID")] 
    public Parent Parent { get; set; } 
} 

이제 (어떤 이유로)이 해결 문제가 있지만 새로운 것을 만들면 고유 한 ID를 얻지 못합니다.

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child) 
    { 
     if (ModelState.IsValid) 
     { 
      int _id; 
      do 
      { 
       _id = new Random().Next(); 
      } while (await _context.Children.Where(b => b.ID == _id).AnyAsync()); 

      child.ID = _id; 
      _context.Add(child); 
      await _context.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     ViewData["ID"] = id; 
     return View(child); 
    } 

이제 doWhile 우리는 두 개의 서로 다른 개체에 동일한 ID를 지정하지 않는 것이 확인합니다 : 내가 직접 만들어, 여기에 방법을 만들 것을 고정. 무작위 옵션의 대안은 Guid (id가 문자열 일 때) 또는 GetHashCode (아마도 충돌의 경우 증분)를 사용하는 것입니다.

관련 문제