我从 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/