我从 webapi 模板创建了一个新的 .NET Core 项目并添加了一个模型类:

public class Todo {
    public int Id { get; set; }
    public string Name { get; set; }
}

我的上下文类:
public SoContext: DbContext {
    public SoContext(DbContextOptions<SoContext> options) { base(options); }
    public DbSet<Todo> Todos { get; set; }
}

我已经注册了这样的上下文:
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<SoContext>(opt => opt.UseInMemoryDatabase("SO"));
    services.AddMvc();
}

我以为我会像这样播种上下文:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, SoContext context)
{
    app.UseMvc();
    context.Todos.Add(new Todo() { Id = 1, Name = "1" });
    context.SaveChanges(); // This works okay!
}

它工作正常......但是在我的请求处理程序中,甚至直接在 Configure 之后,当我运行这个:
context.Todos.Add(new Todo() { Name = "non-seed" });
context.SaveChanges(); // Uh - oh

我得到:



在我看来,更改跟踪器应该已经想出将 2 的 ID 分配给 non-seed Todo ,不是吗?为什么不是这样?

我尝试使用 Attach 而不是 add 用于带有键的实体,即使它没有任何意义,而且确实没有任何区别。

Here's a GitHub repository that demonstrates the problem

最佳答案

更新:这现在适用于 .NET Core 3.0! You can see a showcase here

我在 comment in the GitHub repository for EntityFrameworkCore 中得到了这个问题的答案。



这意味着目前,要么为数据库植入缺少键的实体(因此任何关系都需要使用导航属性而不是 ID 来设置),要么使用原始 SQL 并让 FE 获取已植入的数据库(谢谢, @Nicolaus - 尽管我认为这不适用于内存中)。

关于c# - 更改跟踪器不会为新插入的实体分配正确的后续 ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46018654/

10-09 09:07