C# 实体框架:更新具有IEnumerable属性的实体时出错';Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException';
我正在ASP.NET核心中开发我的第一个webapi。我有两个实体: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
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();