向EF实体添加值对象 - 该实体类型无法配置为所有权,因为它已经被配置为非所有权。

6
我们遇到了以下错误,只有在值对象添加了日期时间时才会发生。'实体类型“TimeWindow”无法配置为所拥有的,因为它已经被配置为非所拥有的。如果您想要覆盖先前的配置,请通过调用“Ignore”从模型中删除实体类型。
值对象类:
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);仍然会出现错误(如错误所建议的)。

1
我只能就 EF Core 进行说明。对于我来说,显然在帖子中没有显示的某些代码(无论是你的还是 ABP 或其他框架/库)正在将你的 TimeWindow 类注册为实体类型(请参阅 EF Core 文档中的包括类型在模型中)。这个操作发生在 b.OwnsOne(b => b.TimeWindow); 调用之前。找到并消除/修复该位置即可。这就是我所能说的。 - Ivan Stoev
2个回答

5
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


0

使用[Owned]修饰拥有的实体也可以解决问题,例如

using Microsoft.EntityFrameworkCore;

[Owned]
public class TimeWindow : ValueObject

不相关但是相同的错误:当您未将所拥有实体的ID设置为长整型时,也可能会显示此错误。

 public class OwnedEntity : AuditedEntity<Guid> //error
 public class OwnedEntity : AuditedEntity<long> //correct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接