【发布时间】: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