Entity framework core 实体框架核心1.1内存中数据库无法添加新实体

Entity framework core 实体框架核心1.1内存中数据库无法添加新实体,entity-framework-core,Entity Framework Core,我在测试设置的单元测试中使用以下代码: var simpleEntity = new SimpleEntity(); var complexEntity = new ComplexEntity { JoinEntity1List = new List<JoinEntity1> { new JoinEntity1 { JoinEntity2List = new List<JoinEntity2>

我在测试设置的单元测试中使用以下代码:

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();
}
var simplentity=new simplentity();
var complexEntity=新的complexEntity
{
JoinEntity1List=新列表
{
新联合体1
{
JoinEntity2List=新列表
{
新联合体2
{
简单性=简单性
}
}
}
}
};
var anotherEntity=新的anotherEntity
{
ComplexEntity=complexEntity1
};
使用(var context=databaseFixture.GetContext())
{
添加(另一个实体);
wait context.saveChangesSync();
}
当到达SaveChangesSync时,EF抛出ArgumentException,并显示以下消息:

已添加具有相同密钥的项。关键词:1

对于单元测试类,我也使用了一个fixture,它用相同类型的对象填充数据库,不过对于这个测试,我需要这个特定的设置,所以我想将这些新实体添加到内存数据库中。我尝试在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);
        }
    }
}
namespace Test.Shared.Fixture
{
使用数据访问;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.DependencyInjection;
MemoryDatabaseFixture中的公共类:IDatabaseFixture
{
私有只读DbContextOptions contextOptions;
公共InMemoryDatabaseFixture()
{
var serviceProvider=newservicecolection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
var builder=new DbContextOptionsBuilder();
builder.UseInMemoryDatabase()的
.UseInternalServiceProvider(服务提供商);
contextOptions=builder.Options;
}
公共MyContext GetContext()
{
返回新的MyContext(contextOptions);
}
}
}

您可以通过使用集合装置来解决此问题,这样您就可以跨多个测试类共享此装置。这样,您就不会多次构建上下文,因此不会出现以下异常:

我自己的例子是:

[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[]>
        {
            (...)
        };
}
[CollectionDefinition(“数据库集合”)]
公共类数据库集合:ICollectionFixture
{  }
[收集(“数据库收集”)]
公共类GetCitiesCmdHandlerTests:IClassFixture
{
私有只读TecCoreDbContext\u上下文;
专用只读IMapper\u映射器;
公共GetCitiesCmdHandlerTests(DatabaseFixture dbFixture、MapperFixture mapFixture)
{
_context=dbFixture.context;
_mapper=mapixture.mapper;
}
[理论]
[成员数据(名称(HandleTestData))]
公共异步无效句柄\u应根据请求返回国家\u(
GetCitiesCommand,
int预期计数)
{
(...)
}
公共静态只读IEnumerable HandleTestData
=新列表
{
(...)
};
}
}

祝你好运,
Seb

您的模型和上下文是什么样子的?