【发布时间】:2019-11-11 17:51:38
【问题描述】:
我有一个带有 CosmosDB 提供程序的 Entity Framework Core 上下文,并且只有一个实体:
public class Entity1
{
public Guid Id { get; set; }
public List<Item> Items { get; set; }
}
这里是实体的内部对象:
public class Item
{
public Guid Id { get; set; }
public List<SubItem> SubItems { get; set; }
}
public class SubItem
{
public Guid Id { get; set; }
public string Name { get; set; }
}
类Entity1 有一个owned 类型为Item 的属性,它还有另一个owned 类型为SubItem 的属性。这是Entity1的配置文件:
public class Entity1Configuration : IEntityTypeConfiguration<Entity1>
{
public void Configure(EntityTypeBuilder<Entity1> builder)
{
builder.ToContainer("Entity1");
builder.HasKey(x => x.Id);
builder.OwnsMany(x => x.Items, itemsBuilder =>
{
itemsBuilder.OwnsMany(t => t.SubItems, subitemsBuilder =>
{
subitemsBuilder.HasKey(x => x.Id);
});
});
}
}
最后,当我尝试访问 DbSet<Entity1> Entities1 的元素时,我从 EF Core 得到一个 InvalidOperationException:
CosmosDbContext cosmosDbContext = new CosmosDbContext("https://localhost:8081", "myprivatekey", "Dev");
cosmosDbContext.Database.EnsureCreated();
var entities = cosmosDbContext.Entities1.ToList();
Console.WriteLine(entities.Count);
例外是这样的:
System.InvalidOperationException:'当从'VisitLambda'调用时,重写'System.Linq.Expressions.ParameterExpression'类型的节点必须返回相同类型的非空值。或者,覆盖 'VisitLambda' 并将其更改为不访问此类子项。'
该行抛出异常:
var entities = cosmosDbContext.Entities1.ToList();
如果我从 Item 类中删除 SubItems 属性,一切正常。我还尝试将 EF 的提供者更改为 OnMemory,并且一切正常。到目前为止,我用谷歌搜索了这个例外,但没有运气。我可以拥有像我的 EF Core 和 CosmosDB 提供者这样的内部实体吗?
【问题讨论】:
标签: c# .net-core entity-framework-core azure-cosmosdb