我在Asp.net Core中使用了EF,但在尝试更新时遇到了以下错误。
类型' System.InvalidOperationException'的例外情况发生在 Microsoft.EntityFrameworkCore.dll但未在用户代码中处理
附加信息:实体类型的实例' TodoItem'不能 被跟踪,因为具有相同密钥的此类型的另一个实例是 已被跟踪。添加新实体时,对于大多数关键类型a 如果没有设置密钥,则将创建唯一的临时密钥值(即,如果 key属性被赋予其类型的默认值)。如果你 明确设置新实体的关键值,确保不这样做 与现有实体或为其他实体生成的临时值发生冲突 新实体。附加现有实体时,请确保只有一个实体 具有给定键值的实体实例附加到上下文。
这是我的更新代码:
public class TodoRepository : ITodoRepository
{
private readonly TodoContext _context;
public TodoRepository(TodoContext context)
{
_context = context;
//initialize database
Add(new TodoItem { Name = "Item1" });
//Add(new TodoItem { Name = "Item2" });
//Add(new TodoItem { Name = "Item3" });
}
public IEnumerable<TodoItem> GetAll()
{
return _context.TodoItems.AsNoTracking().ToList();
}
public void Add(TodoItem item)
{
_context.TodoItems.Add(item);
_context.SaveChanges();
}
public TodoItem Find(long key)
{
return _context.TodoItems.AsNoTracking().FirstOrDefault(t => t.Key == key);
}
public void Remove(long key)
{
var entity = _context.TodoItems.AsNoTracking().First(t => t.Key == key);
_context.TodoItems.Remove(entity);
_context.SaveChanges();
}
public void Update(TodoItem item)
{
_context.TodoItems.Update(item);
_context.SaveChanges();
}
}
正如您所见,我已经尝试过 AsNoTracking ,我也在Startup.cs中尝试过。
public void ConfigureServices(IServiceCollection services)
{
//inject repository into DI container, use database in memory
services.AddDbContext<TodoContext>(options => options.UseInMemoryDatabase().UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
//inject repository into DI container, and use sql databse
//services.AddDbContext<TodoContext>(options=>options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
//The first generic type represents the type (typically an interface) that will be requested from the container.
//The second generic type represents the concrete type that will be instantiated by the container and used to fulfill such requests.
services.AddSingleton<ITodoRepository, TodoRepository>();
//add mvc service to container, this is conventional routing
//This also applys to web api which is Attribute Routing
services.AddMvc();
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
我通过将 services.AddDbContext 更改为 services.AddScoped 解决了此问题,已在下面的链接中指出。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection