아래 샘플 코드에서 수행 할 때 다음 예외가 발생합니다 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();
}
}
}