将值对象添加到 EF 实体 - 实体类型无法配置为拥有,因为它已被配置为非拥有

Adding Value Object to EF Entity - The entity type cannot be configured as owned because it has already been configured as a non-owned

我们收到以下错误,似乎只有在将日期时间添加到值对象时才会发生。 '实体类型 'TimeWindow' 无法配置为拥有,因为它已被配置为非拥有。如果您想覆盖以前的配置,请先通过调用 'Ignore'.

从模型中删除实体类型

值对象class:

public class TimeWindow : ValueObject
    {
        public DateTime? StartTime { get; set; }
        public DateTime? EndTime { get; set; }

        private TimeWindow()
        {
        }

        public TimeWindow(
            DateTime? startTime,
            DateTime? endTime)
        {
            StartTime = startTime;
            EndTime = endTime;
        }

        protected override IEnumerable<object> GetAtomicValues()
        {
            yield return StartTime;
            yield return EndTime;
        }
    }

我们在 OnModelCreating 内部添加了一个 OwnsOne 关系:

builder.Entity<Manifest>(b =>
        {
            b.ToTable(DistributionConsts.DbTablePrefix + "Manifests", DistributionConsts.DbSchema);
            b.ConfigureByConvention();
            b.OwnsOne(b => b.TimeWindow);
        });

我们要将 TimeWindow 值对象添加到的实体:

public class Manifest : FullAuditedAggregateRoot<Guid>
    {
        protected Manifest()
        {
        }

        public Manifest(
            Guid id) : base(id)
        {
        }

        public virtual TimeWindow TimeWindow { get; set; }
    }

我们有另一个实体,它具有以相同方式配置的不同 ValueObject,但没有任何 DateTimes,并且我们没有收到任何错误。 在构建器之前和构建器内部添加 .Ignore(x => x.TimeWindow); 仍然会出错(如错误所提示)。

builder.Ignore<TimeWindow>();
builder.Entity<Manifest>(b =>
            {
                b.ToTable(DistributionConsts.DbTablePrefix + "Manifests", DistributionConsts.DbSchema);
                b.ConfigureByConvention();
                b.OwnsOne(b => b.TimeWindow);
            });

添加 builder.Ignore<TimeWindow>(); 行将从模型中删除实体类型并允许我覆盖它并将其配置为 OwnsOne