在MVC 3.0中使用parent.clear()删除子项目
本文关键字:clear 删除 子项目 parent MVC | 更新日期: 2023-09-27 18:06:15
我试图通过首先从上下文中加载项目然后清除来删除类中的所有子项目。
模型:
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);
}
}
}
我已经尝试将以下内容添加到模型构建器中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
...
modelBuilder.Entity<Ticket>()
.HasMany(t => t.TicketItems)
.WithRequired(i => i.Ticket)
.WillCascadeOnDelete();
...
}
当我在控制器中使用编辑方法时,我得到这个错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性被设置为空值。如果外键不支持空值,则必须定义一个新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我知道这与数据库中的FK约束有关,我只是认为通过添加WillCascadeOnDelete()
这将解决问题,因为Clear()
将删除所有子条目。
您看到的问题是,当您清除实体上的导航属性时,您所做的就是删除两个项目之间的链接(清除外键)。你没有从上下文中删除实体。
请参阅StackOverflow问题实体框架-清除子集合