首页 > 解决方案 > 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 但我不知道为什么......当然,如果我的日期范围有值,一切安好...

对此有任何想法吗?抱歉发了很长的帖子

谢谢!

标签: entity-framework-core

解决方案


正如 Ivan Stoev 所说,由于使用相同实例的自动映射器中的 nullsubstitute ,该对象被共享。


推荐阅读