Как сделать свойство OwnsOne в EF Core 3.0 обязательным при сопоставлении со столбцами SQL Server?

У меня есть основной профиль сущности, у которого есть имя свойства, которое является объектом значения. У объекта Name есть два свойства First и Last. Когда я использую Fluent API для сопоставления свойств объектов Name со столбцами в таблице Profile, я указываю, что они являются обязательными. Когда я создаю миграцию, он говорит, что значение 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();
                });
}

Любая помощь, которую вы можете оказать, была бы замечательной.


person Ken Brannigan    schedule 16.10.2019    source источник


Ответы (2)


EF Core 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

person Maicon Heck    schedule 09.02.2021

Я обратился к команде EF Core, и в настоящее время единственный способ сделать это - вручную изменить созданную миграцию для установки nullable = false. Это было помечено как запрос функции, поэтому будем надеяться, что однажды они исправят это!

person Ken Brannigan    schedule 18.10.2019
comment
Если вы используете .EnsureCreated, миграция не применяется, и, следовательно, свойство допускает значение NULL. Я думаю, что MS ДОЛЖНА исправить это, в противном случае не разрешайте использовать метод .IsRequired внутри собственной конфигурации. В любом случае спасибо, что сообщили об этом. - person Max; 30.12.2019
comment
Ссылка на вышеупомянутый запрос функции: github.com/dotnet/efcore/issues/18445 - person foka; 24.03.2020