【问题标题】:EF Core with CosmosDB: OwnsOne and OwnsMany throw NullReferenceException带有 CosmosDB 的 EF Core:OwnsOne 和 OwnsMany 抛出 NullReferenceException
【发布时间】:2021-10-02 11:52:27
【问题描述】:

我正在开发一个使用 CosmosDB 和 Entity Framework Core 的新项目(通过 Microsoft.EntityFrameworkCore.Cosmos NuGet 包,版本 5.0.7;项目本身是 .NET Core 5)。我都是新手,遇到了一个我无法解决的问题。

简而言之,我需要将一个复杂的对象保存到数据库中。这是一个很大的模型,它下面有多个类的集合,每个类都有自己的属性,有些下面还有集合。我正在尝试使用 OwnsOne 和 OwnsMany 配置 EF,以将这些子对象存储在顶级对象之下。只要所有拥有的对象为空,代码就会编译,并将保存到数据库中。但是每当我将任何东西放入拥有的对象中时,无论是使用 OwnsOne 还是 OwnsMany,我都会得到一对 NullReferenceExceptions。

我试图将我的代码精简到最基本的部分。这是它目前的样子。

拥有者和拥有的类:

public class Questionnaire
{
    // Constructors
    private Questionnaire() { }

    public Questionnaire(Guid id)
    {
        Test = "Test property.";
        TV = new TestQ();
        Id = id;
    }

    public Guid Id { get; set; }
    public string Test { get; set; }
    public TestQ TV { get; set; }

    // Public Methods
    public void AddForm(Form f)
    {
        // not currently using this method
        //Forms.Add(f);
    }
}

public class TestQ
{
    public TestQ()
    {
        TestValue = "test ownsone value";
    }

    public string TestValue { get; set; }
}

数据库上下文:

public class QuestionnaireDbContext : DbContext
{
    public DbSet<Questionnaire> Questionnaires { get; set; }
    public QuestionnaireDbContext(DbContextOptions<QuestionnaireDbContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultContainer(nameof(Questionnaires));
        modelBuilder.Entity<Questionnaire>().HasKey(q => q.Id);
        modelBuilder.Entity<Questionnaire>().OwnsOne(q => q.TV);
    }
}

以及调用 dbContext 的服务中的代码(请注意,这是基于我最初没有设置的通用服务)。实际的异常在这里抛出。

public virtual TEntity Add(TEntity entity)
{
    _context.Entry(entity).State = EntityState.Added;
    _context.SaveChanges();

    return entity;
}

最终我需要它来与 OwnsMany 和一个集合一起使用,但我认为首先让它与 OwnsOne 一起使用可能更简单。这里要注意的关键是,如果我注释掉该行

TV = new TestQ();

在 Questionnaire 类中,模型正确地保留在 CosmosDB 中。只有当我实际实例化一个拥有的实体时,我才会得到 NullReferenceExceptions。

任何建议将不胜感激!谢谢!

【问题讨论】:

    标签: .net-core entity-framework-core azure-cosmosdb


    【解决方案1】:

    好吧,我不确定为什么会出现这种情况,但问题在于我们如何添加文档。使用这个通用代码:

    public virtual async Task<TEntity> Add(TEntity entity)
    {
        _context.Entry(entity).State = EntityState.Added;
        await _context.SaveChanges();
    
        return entity;
    }
    

    是问题所在。如果我像这样使用实际的 QuestionnaireDbContext 类,它就可以正常工作:

    context.Add(questionnaire);
    await context.SaveChangesAsync();
    

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 2013-05-30
      • 2021-06-04
      • 2020-11-17
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多