0

我试图通过首先从上下文中加载项目然后清除来删除类中的所有子项目。

模型:

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()this 可以解决问题,因为Clear()它将删除所有子条目。

4

1 回答 1

1

您看到的问题是,当您清除实体上的导航属性时,您所做的只是删除两个项目之间的链接(清除外键)。您不是从上下文中删除实体。

请参阅 StackOverflow 问题Entity Framework - Clear a Child Collection

于 2013-03-28T16:26:17.863 回答