映射到 SQL 服务器列时,如何在 EF Core 3.0 中创建 OwnsOne 属性?

How to make an OwnsOne property in EF Core 3.0 required when mapping to SQL Server columns?

我有一个主要实体配置文件,它有一个 属性 名称,它是一个值对象。 Name 对象有两个属性 First 和 Last。当我使用 Fluent API 将名称对象属性映射到配置文件 table 中的列时,我指定它们是必需的。当我创建迁移时,它说 nullable 是真的。我认为这与在 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();
                });
}

如果你能提供任何帮助,那就太好了。

我联系了 EF Core 团队,目前唯一的方法是手动更改创建的迁移以设置 nullable = false。它已被标记为一项功能请求,所以我们希望有一天他们能修复它!

EF 核心 5

除了在 ValueObject 内的所需属性上设置 .IsRequired()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