아래 샘플 코드에서 수행 할 때 다음 예외가 발생합니다 db.Entry(a).Collection(x => x.S).IsModified = true.
System.InvalidOperationException : '키 값이'{Id : 0} '인 다른 인스턴스가 이미 추적 중이므로'엔터티 유형 'B'의 인스턴스를 추적 할 수 없습니다. 기존 엔터티를 연결할 때는 지정된 키 값을 가진 엔터티 인스턴스가 하나만 연결되어 있는지 확인하십시오.
B의 인스턴스를 첨부하는 대신 왜 추가하지 않습니까?
이상하게도 설명서 는 가능한 예외로 IsModified지정되지 않았습니다 InvalidOperationException. 잘못된 문서 또는 버그?
나는이 코드가 이상하다는 것을 알고 있지만, 이상한 egde 사례에서 ef core가 어떻게 작동하는지 이해하기 위해서만 작성했습니다. 내가 원하는 것은 설명이 아니라 해결 방법입니다.
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();
}
}
}