以下のサンプルコードでは、実行時に次の例外が発生しdb.Entry(a).Collection(x => x.S).IsModified = true
ます。
System.InvalidOperationException: 'エンティティタイプ' B 'のインスタンスは、キー値' {Id:0} 'の別のインスタンスが既に追跡されているため追跡できません。既存のエンティティをアタッチするときは、特定のキー値を持つエンティティインスタンスが1つだけアタッチされるようにしてください。
Bのインスタンスをアタッチする代わりに追加しないのはなぜですか?
奇妙なことに、のドキュメントにIsModified
はInvalidOperationException
、例外の可能性が明記されていません。無効なドキュメントまたはバグ?
私はこのコードが奇妙であることを知っていますが、奇妙なegdeのケースでefコアがどのように機能するかを理解するためだけにそれを書きました。私が欲しいのは説明ではなく、回避策です。
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
public class A
{
public int Id { get; set; }
public ICollection<B> S { get; set; } = new List<B>() { new B {}, new B {} };
}
public class B
{
public int Id { get; set; }
}
public class Db : DbContext {
private const string connectionString = @"Server=(localdb)\mssqllocaldb;Database=Apa;Trusted_Connection=True";
protected override void OnConfiguring(DbContextOptionsBuilder o)
{
o.UseSqlServer(connectionString);
o.EnableSensitiveDataLogging();
}
protected override void OnModelCreating(ModelBuilder m)
{
m.Entity<A>();
m.Entity<B>();
}
}
static void Main(string[] args)
{
using (var db = new Db()) {
db.Database.EnsureDeleted();
db.Database.EnsureCreated();
db.Add(new A { });
db.SaveChanges();
}
using (var db = new Db()) {
var a = db.Set<A>().Single();
db.Entry(a).Collection(x => x.S).IsModified = true;
db.SaveChanges();
}
}
}