Entity Framework Core 1.1 메모리에서 데이터베이스가 새 엔터티를 추가하지 못함

entity-framework-core

문제

테스트 설정을 위해 단위 테스트에서 다음 코드를 사용하고 있습니다.

var simpleEntity = new SimpleEntity();
var complexEntity = new ComplexEntity
{
    JoinEntity1List = new List<JoinEntity1>
    {
        new JoinEntity1
        {
            JoinEntity2List = new List<JoinEntity2>
            {
                new JoinEntity2
                {
                    SimpleEntity = simpleEntity
                }
            }
        }
    }
};
var anotherEntity = new AnotherEntity
{
    ComplexEntity = complexEntity1
};

using (var context = databaseFixture.GetContext())
{
    context.Add(anotherEntity);
    await context.SaveChangesAsync();
}

SaveChangesAsync에 도달하면 EF는 다음 메시지와 함께 ArgumentException을 throw합니다.

동일한 키를 가진 항목이 이미 추가되었습니다. 키 : 1

나는이 테스트를 위해이 새로운 엔티티를 메모리 데이터베이스에 추가하기를 원하지만 동일한 유형의 객체로 데이터베이스를 채우는 단위 테스트 클래스에도 조명기를 사용하고 있습니다. DbSet (DbContext가 아닌)에 엔티티를 추가하고 세 엔티티를 아무리 쓸데없이 추가하려고 시도했습니다. 그러나 "simpleEntity"를 별도로 추가 할 수는 있지만 (fixture에 추가되지 않았으므로) "complexEntity"또는 "anotherEntity"를 추가하려고하면 EF가 불평합니다.

메모리 데이터베이스의 EF가 컨텍스트의 여러 인스턴스에 대해 여러 개의 Add를 처리 할 수없는 것 같습니다. 이 문제를 해결할 수있는 방법이 있습니까? 아니면 설정에 문제가 있습니까?

이 경우 databaseFixture는이 클래스의 인스턴스입니다.

namespace Test.Shared.Fixture
{
    using Data.Access;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.DependencyInjection;

    public class InMemoryDatabaseFixture : IDatabaseFixture
    {
        private readonly DbContextOptions<MyContext> contextOptions;

        public InMemoryDatabaseFixture()
        {
            var serviceProvider = new ServiceCollection()
            .AddEntityFrameworkInMemoryDatabase()
            .BuildServiceProvider();

            var builder = new DbContextOptionsBuilder<MyContext>();
            builder.UseInMemoryDatabase()
                   .UseInternalServiceProvider(serviceProvider);

            contextOptions = builder.Options;
        }

        public MyContext GetContext()
        {
            return new MyContext(contextOptions);
        }
    }
}

인기 답변

Collection Fixture를 사용하여이 문제를 해결할 수 있으므로이 테스트를 여러 테스트 클래스에 공유 할 수 있습니다. 이렇게하면 여러 번 컨텍스트를 빌드하지 않으므로이 예외가 발생하지 않습니다.

컬렉션 픽스쳐에 관한 정보

내 자신의 예 :

[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{  }

[Collection("Database collection")]
public class GetCitiesCmdHandlerTests : IClassFixture<MapperFixture>
{
    private readonly TecCoreDbContext _context;
    private readonly IMapper _mapper;

    public GetCitiesCmdHandlerTests(DatabaseFixture dbFixture, MapperFixture mapFixture)
    {
        _context = dbFixture.Context;
        _mapper = mapFixture.Mapper;
    }

    [Theory]
    [MemberData(nameof(HandleTestData))]
    public async void Handle_ShouldReturnCountries_AccordingToRequest(
        GetCitiesCommand command,
        int expectedCount)
    {
        (...)
    }

    public static readonly IEnumerable<object[]> HandleTestData
        = new List<object[]>
        {
            (...)
        };
}

}

행운을 빈다, Seb



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.