【发布时间】:2020-04-04 10:33:57
【问题描述】:
我使用 EF 核心: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” 'ManeuverableCabin.GeneratorInstallation#DateRange',但没有 此类型的实体具有相同的键值,已被标记为 '添加'。考虑使用 '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 时,我的对象发生了变化: 看到不同的帖子,我很确定问题是对象变为空但我不知道为什么...... 当然,如果我的日期范围内有价值,那么一切都很好......
对此有任何想法吗? 很抱歉发了这么长的帖子
谢谢!
【问题讨论】:
-
请包括
DateRange类和确切的 EF Core 版本。 -
@IvanStoev 完成,感谢您告诉我 :) 我使用 2.26
-
确保您没有在实体之间共享>
DateRangeobject instances,例如像值对象 - 这是not supported by EF Core -
@IvanStoev 你是我的救星...... Automapper 使用相同的实例......我只是在工作时一直用新实例测试......你能把它作为答案,所以我可以接受它?非常感谢!