2013-03-28 1 views
0

클래스의 하위 항목을 모두 삭제하려면 먼저 컨텍스트에서 항목을로드 한 다음 지우십시오.mvc 3.0에서 parent.clear()가있는 자식 항목을 삭제하십시오.

모델 :

public class Ticket 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<TicketItem> TicketItems { get; set; } 
    public Ticket() 
    { 
     TicketItems = new List<TicketItem>(); 
    } 
} 

public class TicketItem 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 

    [Required] 
    [DataType(DataType.Currency)] 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    public double Price { get; set; } 

    public int TicketId { get; set; } 
    public virtual Ticket Ticket { get; set; } 
} 

컨트롤러 :

[HttpPost] 
    public ActionResult Edit(TicketViewModel ticketViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var ticket = ticketViewModel.Ticket; 
      context.Entry(ticket).State = EntityState.Modified; 
      context.Entry(ticket).Collection(i => i.TicketItems).Load(); 
      ticket.TicketItems.Clear(); 
      context.SaveChanges(); 
      AddOrUpdateItems(ticket, ticketViewModel.Items); 
      return RedirectToAction("Index"); 
     } 
     return View(ticketViewModel); 
    } 

private void AddOrUpdateItems(Ticket ticket, ICollection<AssignedItem> assignedItems) 
    { 
     foreach (var assignedItem in assignedItems) 
     { 
      if (assignedItem.Assigned) 
      { 
       var item = context.Items.Find(assignedItem.Id); 
       var ticketItem = CreateTicketItem(item, ticket); 
       ticket.TicketItems.Add(ticketItem); 
      } 
     } 
    } 

나는 모델 빌더에 다음과 같은 추가 시도 :

내가 컨트롤러 I에서 편집 방법을 사용
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    ... 
     modelBuilder.Entity<Ticket>() 
      .HasMany(t => t.TicketItems) 
      .WithRequired(i => i.Ticket) 
      .WillCascadeOnDelete(); 
    ... 
    } 

이 오류가 발생합니다 :

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

데이터베이스의 FK 제약 조건과 관련이 있습니다. 은 모든 하위 항목을 제거하므로 WillCascadeOnDelete()을 추가하면 문제가 해결 될 것이라고 생각했습니다.

답변

1

엔티티의 탐색 속성을 지우면 두 항목 간 연결이 제거되는 것입니다 (외래 키 삭제). 컨텍스트에서 엔티티를 제거하지 않습니다.

나는 그 대답에서 코드를 통해 보았다 Entity Framework - Clear a Child Collection

+0

StackOverflow의 질문을보고, 나는이 ...은'CollectionChangeEventHandler'가 여기 내 프로젝트 – SOfanatic

+0

에 인식되지 가기로되어 어디 모르겠어요하세요 내가 너라면 어떻게 할거야. ticket.TicketItems를 ticketViewModel.Items와 비교하십시오. TicketItems에는 있지만 Items에는없는 항목의 경우 ticket.TicketItems와 EF DbContext에서 항목을 제거하십시오. Items에는 있지만 TicketItems에는없는 항목은 TicketItems와 EF DbContext에 모두 추가하십시오. –

관련 문제