entity-framework-core - Ef core Ownsone 问题“正在共享餐桌”
问题描述
我使用 EF core : 2.26 并且我有这个数据模型:
public interface IManeuverableAsset
{
OpenStateType? ManeuveredState { get; set; }
}
public interface IGeneratorManeuverableAsset : IManeuverableAsset
{
DateRange GeneratorInstallation { get; set; }
DateRange GeneratorRemoval { get; set; }
}
public class ManeuverableCabin : Entity<Guid>, IGeneratorManeuverableAsset
{
public Cabin Cabin { get; set; }
public List<ManeuverableCell> Cells { get; set; } = new List<ManeuverableCell>();
public DateRange GeneratorInstallation { get; set; }
public DateRange GeneratorRemoval { get; set; }
}
public class ManeuverableCell : Entity<Guid>, IManeuverableAsset
{
public Cell Cell { get; set; }
public List<ManeuverableCircuit> Circuits { get; set; } = new List<ManeuverableCircuit>();
public OpenStateType? ManeuveredState { get; set; }
}
public class ManeuverableCircuit : Entity<Guid>, IGeneratorManeuverableAsset
{
public Circuit Circuit { get; set; }
public OpenStateType? ManeuveredState { get; set; }
public DateRange GeneratorInstallation { get; set; }
public DateRange GeneratorRemoval { get; set; }
}
public class DateRange
{
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
}
配置是这样的:
public class ManeuverableCabinConfiguration : IEntityTypeConfiguration<ManeuverableCabin>
{
public void Configure(EntityTypeBuilder<ManeuverableCabin> builder)
{
//builder.HasBaseType<ManeuverableAsset>();
builder.OwnsOne(entity => entity.GeneratorInstallation);
builder.OwnsOne(entity => entity.GeneratorRemoval);
builder.ToTable(nameof(ManeuverableCabin) + "s");
}
}
public class ManeuverableCellConfiguration : IEntityTypeConfiguration<ManeuverableCell>
{
public void Configure(EntityTypeBuilder<ManeuverableCell> builder)
{
builder.ToTable(nameof(ManeuverableCell) + "s");
}
}
public class ManeuverableCircuitConfiguration : IEntityTypeConfiguration<ManeuverableCircuit>
{
public void Configure(EntityTypeBuilder<ManeuverableCircuit> builder)
{
builder.OwnsOne(entity => entity.GeneratorInstallation);
builder.OwnsOne(entity => entity.GeneratorRemoval);
builder.ToTable(nameof(ManeuverableCircuit) + "s");
}
}
当我只保存一个 ManeuverableCabin(没有单元格/电路)时,它工作正常,但是,一旦我的 DateRange 中有一个没有值的 ManeuverableCircuit,我就会出现以下错误:
'ManeuverableCabin' 类型的实体与'ManeuverableCabin.GeneratorInstallation#DateRange' 类型的实体共享表'ManeuverableCabin',但没有此类型的实体具有已标记为'Added'的相同键值。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看键值。
我的日期范围永远不会为空,充其量只是默认的空实例。这是我保存数据的方式:
public async Task SaveAsync(TEntity aggregate)
{
var existingAggregate = await _context.FindAsync<TEntity>(aggregate.Id);
if (existingAggregate == null)
await _context.AddAsync(aggregate).ConfigureAwait(false);
await _context.SaveChangesAsync().ConfigureAwait(false);
}
当我在 await _context.AddAsync(aggregate).ConfigureAwait(false) 上放置断点时;我的聚合如下所示:
但是当我跨过并进入 SaveChangesAsync 时,我的对象发生了变化: 看到不同的帖子,我很确定问题是对象变为 null 但我不知道为什么......当然,如果我的日期范围有值,一切安好...
对此有任何想法吗?抱歉发了很长的帖子
谢谢!
解决方案
正如 Ivan Stoev 所说,由于使用相同实例的自动映射器中的 nullsubstitute ,该对象被共享。
推荐阅读
- python - 哈希表:赎金票据 Hackerrank (Python)
- c++ - 用 C++ 打印奇怪的符号而不是数组内容
- haskell - 一般来说,如何在 Stack 配置中设置 cabal 选项?
- asp.net-mvc - 如何在 .NET Core 3.1 中对 SSO 使用 Azure AD Saml2 身份验证
- c++ - 将唯一字符串从一个列表复制到另一个列表从文本文件
- python - 你如何在 Battlesnake 中迁移到 api 1?
- python - 如何摆脱日期中无关的零?
- python - 是否有一个 Python 函数可以遍历数据集并计算到给定初始点的欧几里得距离?
- tensorflow - 为什么 tflite 模式中的 SparseIndexVector 是联合?
- python - 如果我将列表中的字符串与字符串变量进行比较,它是检查单词中的所有字符还是列表中的单词本身