2016-09-19 3 views
-1

안녕하세요, 저는 최근에 asp.net에 들어가기 시작했습니다. 아직 익숙하지 않습니다. 나는 프로젝트에서 일하고 벽에 부딪쳤다. 먼저 프로젝트에 대해 자세히 설명해 드리겠습니다. 나는 그들과 함께 작업을 공유 할 수있는 "연락처"로 등록 된 다른 기존 사용자를 추가 할 수있는 몇 가지 기능 중 하나를 사용하여 스케줄링 시스템을 만들려고합니다.asp.net MVC에서 두 개의 기본 키가있는 데이터베이스에서 항목을 삭제하려면 어떻게합니까?

사용자는 기존 사용자의 이메일을 검색하여이를 수행하며, 존재하는 경우 해당 사용자를 연락처로 추가 할 수 있습니다.

여기 내 문제가 있습니다. 연락처 및 모든 추가 잘 작동하지만 그들을 삭제하는 데 문제가 있습니다. 삭제 작업 링크에 대한 인덱스보기에서는 ContactUserId와 ApplicationUserId를 모두 사용하여 연결 클래스이고 두 개의 기본 키가 있기 때문에 작동하지 않습니다. 나를 도울 꺼려하는 내 친구는 두 개의 기본 키를 묶어야한다고 제안했지만 어떻게 해야할지 잘 모릅니다. 어떤 도움을 주셔서 감사합니다.

컨트롤러 :

[Authorize] 
public class ContactsController : Controller 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 

    // GET: Contacts 
    public ActionResult Index() 
    { 

     IEnumerable<ApplicationUser> users = db.Users.ToList(); 

     IEnumerable<Contact> contacts = db.Contacts.ToList().Where(c =>  c.ApplicationUserID.Equals(User.Identity.Name)); 

     List<ApplicationUser> curUsers = new List<ApplicationUser>(); 

     foreach (var contact in contacts) 
     { 
      foreach (var user in users) 
      { 
       if (contact.ContactUserID.Equals(user.UserName)) 
       { 
        curUsers.Add(user); 
       } 
      } 
     } 

     ContactsViewModel cvm = new ContactsViewModel(); 
     cvm.users = curUsers; 
     cvm.contacts = contacts; 

     return View(cvm); 
    } 

    // GET: Contacts/Details/5 
    public ActionResult Details(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Contact contact = db.Contacts.Find(id); 
     if (contact == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(contact); 
    } 

    // GET: Contacts/Create 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    // POST: Contacts/Create 
    // To protect from overposting attacks, please enable the specific  properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include =  "ApplicationUserID,ContactUserID,Date")] Contact contact) 
    { 
     if (!String.IsNullOrWhiteSpace(contact.ContactUserID)) 
     { 

      var count = db.Users.Count(u => u.UserName == contact.ContactUserID); 

      if (count != 0) 
      { 
       contact.ApplicationUserID = User.Identity.Name; 
       contact.Date = DateTime.Today; 
       db.Contacts.Add(contact); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      //User already exist error message       
     } 

     return View(contact); 
    } 

    // GET: Contacts/Edit/5 
    public ActionResult Edit(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Contact contact = db.Contacts.Find(id); 
     if (contact == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(contact); 
    } 

    // POST: Contacts/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "ApplicationUserID,ContactUserID,Date")] Contact contact) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(contact).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(contact); 
    } 

    // GET: Contacts/Delete/5 
    public ActionResult Delete(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Contact contact = db.Contacts.Find(id); 
     if (contact == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(contact); 
    } 

    // POST: Contacts/Delete/5 
    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public ActionResult DeleteConfirmed(string id) 
    { 
     Contact contact = db.Contacts.Find(id); 
     db.Contacts.Remove(contact); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
} 

모델 :

public class Contact 
{ 
    [Key] 
    [Column(Order = 0)] 
    [Required] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public string ApplicationUserID { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [Display(Name = "Contact Email")] 
    [Required (ErrorMessage = "Contact email is required")] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public string ContactUserID { get; set; } 

    public DateTime Date { get; set; } 
} 

색인보기 :

@model MySchedule.ViewModels.ContactsViewModel 

@{ 
ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
@Html.ActionLink("Add", "Create") 
</p> 
<table class="table"> 
<tr> 
    <th> 
     <[email protected]@Html.DisplayNameFor(model => model.Date)--> 
     First Name 
    </th> 
    <th> 
     Last Name 
    </th> 
    <th> 
     Email Name 
    </th> 
    <th></th> 
</tr> 
@{ 
var users = Model.users; 
@foreach (var item in users) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.FirstName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.LastName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Email) 
     </td> 
     <td> 
      @Html.ActionLink("D", "Details", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("X", "Delete", new { /* id=item.PrimaryKey */ }) 
     </td> 
    </tr> 
} 
} 
</table> 

뷰 모델 :

public class ContactsViewModel 
{ 
    public IEnumerable<ApplicationUser> users { get; set; } 
    public IEnumerable<Contact> contacts { get; set; } 

} 

답변

0

간단한 대답 : EF에서 엔티티에 복합 키를 정의한 경우 검색을 위해 찾기를 사용하려면 정의한 모든 키를 제공해야합니다. 위와 같은 방법으로 찾기를 호출해야합니다 :

Contact contact = db.Contacts.Find(applicationUserID, contactUserID); 

좀 더 원하는 경우. 당신이 원하는 것을 달성하기 위해 다음 단계를 수행

을 다음과 같이 GET 조치를 삭제 리팩토링 : 또한

public ActionResult Delete(string applicationUserID, string contactUserID) 
     { 
      Contact contact = db.Contacts.Find(applicationUserID, contactUserID); 
      if (contact == null) 
       return HttpNotFound(); 

      return View(contact); 
     } 

하는 것은 귀하의 게시물 행동 (DeleteConfirmed)을 삭제 리팩토링 :

// POST: Contacts/Delete/5 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public ActionResult DeleteConfirmed(string applicationUserID, string contactUserID) 
     { 
      Contact contact = db.Contacts.Find(applicationUserID, contactUserID); 
      db.Contacts.Remove(contact); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

Index.cshtml보기에서 액션을 삭제할 링크를 생성하십시오 :

@Html.ActionLink("X", "Delete", new { item.ApplicationUserID, item.ContactUserID }) 

이렇게하면 문제가 해결 될 것입니다.하지만 당신이 반복하고있는 속성을 변경하고 있다고 생각합니다. 아마도 Model.users 대신 Model.contacts을 반복해야할까요?

희망이 도움이됩니다.

+0

고맙습니다. 지금은 이해합니다. 그러나 문제는 Model.users를 반복하여 전자 메일, 연락처 및 성을 표시해야한다는 것입니다. – Eli2099

+0

@DeanStrydom, 문제 없습니다. 기꺼이 도와주세요. Contact 클래스에 이러한 속성이 있다고 생각하지 않습니다. 아마도 귀하의 연락처 클래스에 필요한 속성을 추가하고 해당 속성을보기에 표시해야합니다. 또한 여러 열의 삭제 문제에 대해 물어볼 때 문제가 해결되었다고 생각되면 답변을 표시해 주시겠습니까? –

관련 문제