Entity framework core Ef核心拥有一个问题';正在共享表';
我使用EF core:2.26,我有以下数据模型:Entity framework core Ef核心拥有一个问题';正在共享表';,entity-framework-core,Entity Framework Core,我使用EF core:2.26,我有以下数据模型: public interface IManeuverableAsset { OpenStateType? ManeuveredState { get; set; } } public interface IGeneratorManeuverableAsset : IManeuverableAsset { DateRange GeneratorInstallation { g
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; }
}
公共接口iManueVerableAsset
{
OpenStateType?机动状态{get;set;}
}
公共接口IGeneratorManeuvrableAsset:ImanueVerableAsset
{
DateRange GeneratorInstallation{get;set;}
DateRange GeneratorRemoval{get;set;}
}
公共级机动座舱:实体,IGeneratorManeuvLeasset
{
公共客舱{get;set;}
公共列表单元格{get;set;}=new List();
公共日期范围生成器安装{get;set;}
公共DateRange GeneratorRemoval{get;set;}
}
公共类可操作单元:实体,imaneueverableasset
{
公共单元格{get;set;}
公共列表电路{get;set;}=new List();
公共OpenStateType?机动状态{get;set;}
}
公共类可操作回路:实体,IGeneratorManeuvLeasset
{
公共电路{get;set;}
公共OpenStateType?机动状态{get;set;}
公共日期范围生成器安装{get;set;}
公共DateRange GeneratorRemoval{get;set;}
}
公共类日期范围
{
公共日期时间?开始{get;set;}
公共日期时间?结束{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");
}
}
公共类可操纵驾驶舱配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
//builder.HasBaseType();
builder.OwnsOne(entity=>entity.GeneratorInstallation);
builder.OwnsOne(entity=>entity.GeneratorRemoval);
建造商:ToTable(机动驾驶舱名称)+“s”);
}
}
公共类可操作单元配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建造商:ToTable(可移动电池的名称)+“s”);
}
}
公共类可操作电路配置:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
builder.OwnsOne(entity=>entity.GeneratorInstallation);
builder.OwnsOne(entity=>entity.GeneratorRemoval);
ToTable(机动电路的名称)+“s”);
}
}
当我只保存一个可操纵的座舱(没有电池/电路)时,它工作正常,但是,一旦我的日期范围内有一个无值的可操纵电路,我就会出现以下错误:
“机动舱”类型的实体正在共享该表
“机动驾驶室”具有以下类型的实体
“机动座舱。发电机安装#日期范围”,但没有
具有已标记为的相同键值的此类型的实体
“添加”。考虑使用
“DbContextOptions Builder.EnableSensivedAtalogging”查看密钥
价值观。”
我的日期范围从不为空,充其量只是默认的空实例。
以下是我如何保存数据:
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);
}
public async Task SaveAsync(tenty聚合)
{
var existingAggregate=wait_context.FindAsync(aggregate.Id);
if(existingAggregate==null)
await\u context.AddAsync(聚合).ConfigureAwait(false);
wait _context.SaveChangesAsync().configurewait(false);
}
当我在await\u context.AddAsync(aggregate).ConfigureAwait(false)上放置断点时;
我的汇总如下所示:
但当我跨过并进入SaveChangesSync时,我的对象会发生变化:
看到不同的帖子,我很确定问题是对象变为null,但我不知道为什么。。。
当然,如果我的日期范围内有值,一切都很好
有什么想法吗?
很抱歉发了这么长的邮件
谢谢 正如Ivan Stoev所说,由于使用相同实例的auto mapper中的nullsubstitute,该对象被共享。请包含
DateRange
类和确切的EF核心版本。@Ivan Stoev完成,感谢您告诉我:)我使用2.26确保您没有在实体之间共享DateRange
对象实例,例如,像价值对象-这是@IvanStoev你是我的救世主。。。Automapper使用相同的实例。。。我只是在t工作时一直使用新实例进行测试。。。你能把它作为答案,这样我就可以接受了吗?谢谢!