【问题标题】:Ef core Ownsone problem 'is sharing the table'Ef core Ownsone 问题“正在共享餐桌”
【发布时间】: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
  • 确保您没有在实体之间共享​​> DateRange object instances,例如像值对象 - 这是not supported by EF Core
  • @IvanStoev 你是我的救星...... Automapper 使用相同的实例......我只是在工作时一直用新实例测试......你能把它作为答案,所以我可以接受它?非常感谢!

标签: entity-framework-core


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 2023-02-16
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多