2011-04-19 2 views
0

두 가지 모델이 있습니다. Person과 Ingredient 그리고 내가 원하는 것은 누구나 jQuery 자동 완성을 통해 재료를 선택하고 데이터를 입력 한 다음 저장합니다. 데이터베이스에.모델 개체에 대한 링크가있는 모델 추가 EFModelFirst

public class Person { 

      public int PersonID { get; set; } 

      [Required(ErrorMessage="Given name is a required field")] 
      [DisplayName("Given name")] 
      public string GivenName { get; set; } 

      [Required(ErrorMessage="Family name is a required field")] 
      [DisplayName("Family name")] 
      public string FamilyName { get; set; } 

      [Required(ErrorMessage = "Birthdate is a required field")] 
      [DisplayFormat(DataFormatString = "{0:d}")] 
      public DateTime Birthdate { get; set; } 

      [DisplayName("Ingredient")] 
      public virtual Ingredient Ingredient { get; set; } 
    } 

그리고 :

그래서 이렇게 될 것

public class Ingredient { 
    public int IngredientID { get; set; } 

    [Required(ErrorMessage = "Ingredient is a required field")] 
    [Remote("IngredientExists", "Person")] 
    public string Name { get; set; } 

    public virtual ICollection<Person> Persons { get; set; } 
} 

이제 내보기는 현재 다음과 같습니다 이

<div class="editor-label"> 
    @Html.LabelFor(model => model.Ingredient) 
</div> 
    <div id="ingredients-list" class="editor-field">   
    @Html.EditorFor(model => model.Ingredient.Name) 
     @Html.ValidationMessageFor(model => model.Ingredient.Name) 
     @ViewBag.IngredientError 
</div> 
(단지 성분 부분 니펫)

컨트롤러 :

// 
// POST: /Person/Create 

[HttpPost] 
public ActionResult Create(Person person) { 
    if (ModelState.IsValid) { 
     db.People.Add(person); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    person.Ingredient.Name = ""; 

    return View(person); 
} 

1 개의 것을 제외하고는이 모든 것은 작동합니다 (약간의 주요 쟁점), 드롭 다운에서 재료를 선택하면 사람을 저장하고 새 ID와 동일한 값으로 데이터베이스에 새로운 재료를 만듭니다 선택한 하나 (예 : 중복). 이제는 EF와 LINQ에 새로운 것이므로 아직 어떻게해야하는지 알지 못했습니다. 어떤 아이디어/솔루션이라도 대단히 감사하겠습니다!

+0

을 Btw는. 비슷한 질문이 100 번 요청되었으므로 검색을 사용해보십시오. –

답변

1

의 값 속성에 바인딩 할 수 있습니다 :

context.People.Add(person); 

당신은 사람이 삽입해야합니다 새로운 엔티티를하지만 같은 시간에 당신이 말하는 EF 말을하는이 부착되지 않은 모든 관련 기관 문맥에 새로운 것은 또한이다. 당신은 단지 사람을 추가하려면

대신이 시도 할 수 있습니다 :

context.People.Attach(person); 
context.Entry(person).State = EntityState.Added; 
0

외래 키 지원을 사용하여 sugguest 할 것입니다. 인물 모델에 IngredientID 속성을 만든 다음 속성을 기본 구성 요소의 IngredientID 키로 설정합니다.

var ingredient = db.Ingredients.Single(i => i.Name == name); //throws exception if more than one ingredient with that name excists 
person.Ingredient = ingredient; 
db.Persons.Add(person) 
+0

나는 이것을 구현하는 방법을 실제로 얻지 못한다. (필자의 견해에는 드롭 다운이 없으며, 재료의 ID가 아니라 이름 뿐이다.) 조금 더 자세히 설명해 주시겠습니까? – Fverswijver

0

을 당신이 호출하는 경우 : 아마 IngredientID는 다음 방금 선택 성분을 사용자가 선택할 수있는 이름은 참으로 독특한 있다고 가정 드롭 다운 항목

public class Person { 
    public int IngredientID { get; set; } 
}