gpt4 book ai didi

c# - 在没有 key : Unable to track an instance of type 'MyEntity' because it does not have a primary key 的情况下初始化 DbSet 时出错

转载 作者:行者123 更新时间:2023-12-03 23:09:54 24 4
gpt4 key购买 nike

我有一个 DbContext其中有一个 Dbset没有 key 。它适用于仅查询表的应用程序。

public class MyDbContext : DbContext, IMyDbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
public DbSet<MyEntity> MyEntities { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().HasNoKey(); // No key
modelBuilder.ApplyConfigurationsFromAssembly(typeof(MyDbContext).Assembly);
}
}
我在测试项目 (xUnit) 中创建了以下测试设置类:
public static class MyDbContextFactory
{
internal static MyDbContext Create()
{
var options = new DbContextOptionsBuilder<MyDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
var context = new MyDbContext(options);
context.Database.EnsureCreated();
context.MyEnities.AddRange(new[] // This line got the error!!!
{
new MyEntity { Time = DateTime.Now, Instrument = "R1" },
new MyEntity { Time = DateTime.Now, Instrument = "R2" },
new MyEntity { Time = DateTime.Now, Instrument = "R3" },
});
context.SaveChanges();
return context;
}
}

public class QueryTestFixture : IDisposable
{
public MyDbContext MyDbContext { get; }
public IMapper Mapper { get; }

public QueryTestFixture()
{
MyDbContext = MyDbContextFactory.Create();
var configurationProvider = new MapperConfiguration(cfg =>
{
cfg.AddProfile<MappingProfile>();
});
Mapper = configurationProvider.CreateMapper();
}

public void Dispose()
{
// ... omitted ...
}
}

[CollectionDefinition("QueryTests")]
public class QueryCollection : ICollectionFixture<QueryTestFixture> { }
这是测试代码。
[Collection("QueryTests")]
public class MyTest
{
private readonly MyDbContext _context;
private readonly IMapper _mapper;

public MyTest(QueryTestFixture fixture)
{
_context = fixture.MyDbContext;
_mapper = fixture.Mapper;
}
}
但是,在实际运行测试之前,运行任何测试方法都会出现以下错误。错误发生在 行上context.MyEnities.AddRange(.... 以上。
信息:
System.AggregateException :发生一个或多个错误。 (无法跟踪类型为“MyEntity”的实例,因为它没有主键。只能跟踪具有主键的实体类型。)(以下构造函数参数没有匹配的装置数据:QueryTestFixture 装置)
---- System.InvalidOperationException:无法跟踪“MyEntity”类型的实例,因为它没有主键。只能跟踪具有主键的实体类型。
---- 以下构造函数参数没有匹配的夹具数据:QueryTestFixture fixture
堆栈跟踪:
----- 内部堆栈跟踪 #1 (System.InvalidOperationException) -----
StateManager.GetOrCreateEntry(对象实体)
DbContext.SetEntityStates(IEnumerable`1 个实体,EntityState entityState)
DbContext.AddRange(IEnumerable`1 个实体)
DbContext.AddRange(Object[] 实体)
InternalDbSet`1.AddRange(TEntity[] 实体)
MyDbContextFactory.Create() 第 20 行
QueryTestFixture.ctor() 第 16 行
----- 内部堆栈跟踪 #2 (Xunit.Sdk.TestClassException) -----

最佳答案

到目前为止,这是 Entity Framework 上的一个悬而未决的问题:https://github.com/aspnet/EntityFramework.Docs/issues/898

您不能在没有键的 DbQuery 或 DbSet 上添加新实体。
我建议你跟踪这个问题,现在模拟你的上下文或使用 Entity Framework Core Mock来实现这一点。

关于c# - 在没有 key : Unable to track an instance of type 'MyEntity' because it does not have a primary key 的情况下初始化 DbSet 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59363290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com