클래스의 하위 항목을 모두 삭제하려면 먼저 컨텍스트에서 항목을로드 한 다음 지우십시오.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()
을 추가하면 문제가 해결 될 것이라고 생각했습니다.
StackOverflow의 질문을보고, 나는이 ...은'CollectionChangeEventHandler'가 여기 내 프로젝트 – SOfanatic
에 인식되지 가기로되어 어디 모르겠어요하세요 내가 너라면 어떻게 할거야. ticket.TicketItems를 ticketViewModel.Items와 비교하십시오. TicketItems에는 있지만 Items에는없는 항목의 경우 ticket.TicketItems와 EF DbContext에서 항목을 제거하십시오. Items에는 있지만 TicketItems에는없는 항목은 TicketItems와 EF DbContext에 모두 추가하십시오. –