我有一个主要的实体Profile,它的属性Name是一个值对象。 Name对象具有两个属性First和Last。当我使用Fluent API将Name对象的属性映射到Profile表中的列时,我指定它们是必需的。当我创建迁移时,它说nullable为true。我认为这与以下事实有关:在EF Core 3.0中,所拥有的实体现在是可选的,但是我如何告诉EF实际上是必需的呢?
public class Profile
{
public Name Name { get; private set; }
...
}
public class Name
{
public string First { get; }
public string Last { get; }
...
}
public override void Configure(EntityTypeBuilder<Profile> builder)
{
base.Configure(builder);
builder.OwnsOne(
navigationExpression: p => p.Name,
buildAction: n =>
{
n.Property(n => n.First)
.HasColumnName("NameFirst")
.HasMaxLength(25)
.IsRequired();
n.Property(n => n.Last)
.HasColumnName("NameLast")
.HasMaxLength(25)
.IsRequired();
});
}
您能提供的任何帮助都会很棒。
答案 0 :(得分:5)
除了在 .IsRequired()
内的必需属性上设置 ValueObject
,
您需要在 x.OwnsOne(...)
:
builder.OwnsOne(o => o.Address, a =>
{
a.WithOwner();
a.Property(p => p.Street)
.IsRequired();
a.Property(p => p.ZipCode)
.IsRequired();
a.Property(p => p.City)
.IsRequired();
}).Navigation(p => p.Address).IsRequired();
=============^========================================^
问题: https://github.com/dotnet/efcore/issues/12100
感谢:@AndriySvyryd
答案 1 :(得分:0)
我与EF Core团队取得了联系,目前唯一的方法是手动更改创建为nullable = false的迁移。它已被标记为功能请求,所以我们希望有一天他们能解决它!