映射到SQL Server列时如何在EF Core 3.0中创建OwnsOne属性?

时间:2019-10-16 15:55:02

标签: c# entity-framework-core ef-core-3.0

我有一个主要的实体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();
                });
}

您能提供的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:5)

EF 核心 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的迁移。它已被标记为功能请求,所以我们希望有一天他们能解决它!