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

Jam*_*ame 6 entity-framework entity-framework-core asp.net-core abp

我们收到以下错误,该错误似乎仅在将日期时间添加到值对象时才会发生。'实体类型'TimeWindow'无法配置为拥有的,因为它已被配置为非拥有的。如果您想覆盖以前的配置,请首先通过调用“忽略”从模型中删除实体类型。

值对象类:

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

        public virtual TimeWindow TimeWindow { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*ame 5

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

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