C# 实体框架:更新具有IEnumerable属性的实体时出错';Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException';

C# 实体框架:更新具有IEnumerable属性的实体时出错';Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException';,c#,.net,asp.net-core,entity-framework-core,C#,.net,Asp.net Core,Entity Framework Core,我正在ASP.NET核心中开发我的第一个webapi。我有两个实体: public class Event : Entity { private ISet<Ticket> _tickets = new HashSet<Ticket>(); public string Name { get; protected set; } public string Description { get; protected set; } public Da

我正在ASP.NET核心中开发我的第一个webapi。我有两个实体:

public class Event : Entity
{
    private ISet<Ticket> _tickets = new HashSet<Ticket>();
    public string Name { get; protected set; }
    public string Description { get; protected set; }
    public DateTime StartDate { get; protected set; }
    public DateTime EndDate { get; protected set; }
    public DateTime CreatedAt { get; protected set; }
    public DateTime UpdatedAt { get; protected set; }
    public IEnumerable<Ticket> Tickets => _tickets;

    //.....

     public void AddTickets(int amount, decimal price)
    {
        var seating = _tickets.Count + 1;
        for (var i = 0; i < amount; i++)
        {
            _tickets.Add(new Ticket(this, seating, price));
            seating++;
        }
    }
 }

  public class Ticket : Entity
{
    public Guid EventId { get; protected set; }
    public decimal Price { get; protected set; }
    //... and other properties
}
之后,它抛出一个异常:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.

我的问题是:在这种情况下不应该是插入查询而不是更新吗?在这种情况下,并发问题的原因是什么?我是.NET和Concurence的新手,如果您能提供帮助,我将不胜感激。

在AddTicketSync方法中,您可以检索事件对象的附加实体

您应该能够通过调用AddTickets方法并在保存更改后对其进行更新

 @event.AddTickets(amount, price);
 _eventRepository.your_context.SaveChangesAsync();
这样,您将保存已更新事件实体的状态


您遇到了并发错误,因为您正在尝试更新连接的实体。下面的帖子可以帮助你

谢谢你的回复。幸好没用。仍然返回相同的错误…您可以尝试分离eventToAdd var entity=\u context.Events.Add(@event)_上下文。分离(实体);wait_context.SaveChangesAsync();您可以将Ticket.Id属性配置为ValueGeneratedNever
[DatabaseGenerated(DatabaseGeneratedOption.None)]
。您不是通过context.Tickets.Add()添加Ticket,而是将它们添加到event.Tickets集合中。因此,它们不会设置为添加的实体状态。相反,它们在逻辑上没有被追踪。Change tracker在本例中将未跟踪的实体视为已修改。感谢您的评论。看来你是对的。如果我在一个步骤(context.Events.AddAsync(//Event with Tickets)中添加一个带有票证的事件,然后再添加SaveAsync(),则工作正常。如果它是按顺序发生的:“添加事件>保存>使用票证更新事件实体>保存”,则会出现错误。那么我如何更改更改跟踪器的行为?方法是添加:.UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll))到AddDbContext方法中的选项它不起作用。我想我是根据您的第一条评论找到原因的。我的所有实体都是用构造函数从实体基类继承的:受保护的实体(){Id=Guid.NewGuid();}当我删除Id生成时,它工作正常…我不确定它是否有意义,但看起来票据实体在生成时已经有Id!=null,因此EF希望更新它们而不是插入新记录。。。
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.
 @event.AddTickets(amount, price);
 _eventRepository.your_context.SaveChangesAsync();