【问题标题】:Exception with owned collections with EF Core and CosmosDB providerEF Core 和 CosmosDB 提供程序的自有集合异常
【发布时间】: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&lt;Entity1&gt; 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


    【解决方案1】:

    参考Translation of Lambda in SqlTranslator throws exception,这是一个已在较新的 EntityFrameworkCore 包中修复的错误。

    请升级到最新版本,例如:3.1.0-preview2.19525.5。我在我身边测试,问题解决了。

    【讨论】:

    • 我无法在我的环境中使用预览包?
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2020-04-22
    • 2021-03-29
    • 2021-06-04
    • 2011-07-22
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多