数据库操作预计影响 1 行,但实际影响 0 行。实体的集合未被跟踪?



我收到这个错误:

数据库操作预计影响1行,但实际影响0行

向实体的集合添加新元素时。

Domain项目中的基类:

public class Tour
{
private List<Stop> _stops;

public Guid Id { get; private set; }
public Tour(Guid id)
{
Id = id;
_stops = new List<Stop>();
}
public IReadOnlyList<Stop> Stops { get { return _stops; } }

public void AddStop(Stop newStop)
{
//some logic and checking
_stops.Add(newStop);
}
}
public class Stop
{
public Stop(Guid id)
{
Id = id;
}
public Guid Id { get; private set; }
}

我在Infrastructure项目中的DbContext

public class TourDbContext : DbContext, ITourDbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=(localdb)\mssqllocaldb;Database=db");
}

public DbSet<Tour> Tours { get; set; }
public DbSet<Stop> Stops { get; set; }
}

Application项目中调用AddStopToTour()时引发异常。

DbContext接口,基于:https://github.com/jasontaylordev/CleanArchitecture.

public interface ITourDbContext
{
public DbSet<Tour> Tours { get; set; }
public DbSet<Stop> Stops { get; set; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
}
public class SomeClass
{
ITourDbContext _context;
public SomeClass(ITourDbContext context) 
{
_context = context;
}
public async Task AddStopToTour(Guid id)
{
var tour = await _context.Tours
.Include(x => x.Stops)
.SingleOrDefaultAsync(e => e.Id == id);
tour.AddStop(new Stop(Guid.NewGuid());
await _context.SaveChangesAsync(); //Exception
}
}

EF Core难道不应该自动跟踪这些更改并在Stops表中添加一个新行吗?我是否缺少实体上的附加配置?

问题是,通过手动生成我的Id,新实体获得了Modified状态,而不是Added状态。修复是使用Fluent API的.ValueGeneratedNever()方法和modelBuilder

请参阅:https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/breaking-changes#detectchanges-遵守存储生成的密钥值

最新更新