Asp.netコアEFアップデート

asp.net-core-mvc entity-framework-core

質問

私はAsp.netコアでEFを使用しましたが、更新しようとするとエラーが発生しました。

Microsoft.EntityFrameworkCore.dllで 'System.InvalidOperationException'タイプの例外が発生しましたが、ユーザーコードで処理されませんでした

追加情報:エンティティ・タイプ 'TodoItem'のインスタンスは、同じキーを持つこのタイプの別のインスタンスがすでにトラッキングされているため、追跡できません。新しいエンティティを追加するとき、ほとんどのキータイプに対して、キーが設定されていない場合(つまり、キープロパティにそのタイプのデフォルト値が割り当てられている場合)、一意の一時キー値が作成されます。新しいエンティティのキ​​ー値を明示的に設定する場合は、既存のエンティティや他の新しいエンティティ用に生成された一時的な値と衝突しないようにしてください。既存のエンティティをアタッチする場合は、指定されたキー値を持つエンティティインスタンスが1つだけコンテキストにアタッチされていることを確認します。

ここに私の更新コードがあります:

    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();
}

どんな助けもありがとう。

受け入れられた回答

私はservices.AddDbContextservices.AddScopedに変更することでこの問題を解決しました。これは以下のリンクで指摘されています。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ