Проблема с отображением собственных типов в EF Core 3.0

Я мигрировал из EF Core Preview5 в Preview7, и теперь у меня есть те же внутренние сложные свойства, которые отображаются через select.

Например:

public class Car
{
    public Volume Volume { get; set; }
    public string OtherProperty { get; set; }
}

[Owned]
public class Volume
{
    public float Height { get; set; }
    public float Width { get; set; }
    public float Length { get; set;}
}

Ранее код modelBuilder.Entity<Car>().OwnsOne(e => e.Volume) работал правильно, но теперь его нужно использовать WithOwner но я не могу понять (см. здесь: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes) я не могу использовать код нравится: modelBuilder.Entity<Car>().OwnsOne(e => e.Volume).WithOwner("Car") или же modelBuilder.Entity<Car>().OwnsOne(e => e.Volume).WithOwner(f => f.Car), У кого-нибудь есть такая же проблема?

Благодарю.

Обновить.

Я проверил OrderStoreDbContextModelSnapshot.cs. Я разместил здесь другой пример, полностью соответствующий верхнему примеру.

modelBuilder.Entity("DatabaseServiceNew.Database.Order_information.OrderProfile", b =>
            {
                b.HasOne("DatabaseService.Database.Order_information.Order", "Order")
                    .WithOne("OrderProfile")
                    .HasForeignKey("DatabaseServiceNew.Database.Order_information.OrderProfile", "OrderId")
                    .OnDelete(DeleteBehavior.Cascade)
                    .IsRequired();

                b.OwnsOne("FoundationClasses.Technical_Classes.Volume", "Volume", b1 =>
                    {
                        b1.Property<Guid>("OrderProfileId");

                        b1.Property<float>("Cum");

                        b1.Property<float>("Height");

                        b1.Property<float>("Length");

                        b1.Property<float>("Width");

                        b1.HasKey("OrderProfileId");

                        b1.ToTable("OrderProfiles");

                        b1.WithOwner()
                            .HasForeignKey("OrderProfileId");
                    });

                b.OwnsOne("WebFoundationClassesCore.Data_classes.GeoPoint", "EndPoint", b1 =>
                    {
                        b1.Property<Guid>("OrderProfileId");

                        b1.Property<string>("Address");

                        b1.Property<double>("Latitude");

                        b1.Property<double>("Longitude");

                        b1.HasKey("OrderProfileId");

                        b1.ToTable("OrderProfiles");

                        b1.WithOwner()
                            .HasForeignKey("OrderProfileId");
                    });

                b.OwnsOne("WebFoundationClassesCore.Data_classes.GeoPoint", "StartPoint", b1 =>
                    {
                        b1.Property<Guid>("OrderProfileId");

                        b1.Property<string>("Address");

                        b1.Property<double>("Latitude");

                        b1.Property<double>("Longitude");

                        b1.HasKey("OrderProfileId");

                        b1.ToTable("OrderProfiles");

                        b1.WithOwner()
                            .HasForeignKey("OrderProfileId");
                    });
            });

где

[Owned, ComplexType]
public class Volume
{
    public float Height { get; set; }
    public float Width { get; set; }
    public float Length { get; set;}
}


[Owned, ComplexType]
public class GeoPoint 
{
    public GeoPoint() 
    {
    }
    public GeoPoint(double latitude, double longitude, string address) 
    {
        this.Address = address;
        this.Latitude = latitude;
        this.Longitude = longitude;
    }

    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public string Address { get; set;}
}

Итак, как мы видим, ContextSnapshot правильно отображает данные (атрибут ComplexType ничего не делает в реальном случае в этом случае, экспериментально).

OrderStoreDbContext имеет public DbSet<OrderProfile> OrderProfiles { get; set; } свойство.

Но запрос linq var orderProfiles = await orderDbContext.OrderProfiles.ToListAsync(); отображает только простые типы (которые существуют в таблице OrderProfiles, но не являются сложными.var orderProfiles = await orderDbContext.OrderProfiles.Include(p => p.Volume).ToListAsync(); Код также не имеет никакого эффекта - я получаю orderProfiles.Volume а также orderProfiles.StartPoint а также orderProfiles.EndPoint значения как null,

Но в Preview5 этот код работает нормально. Разработчики Microsoft сломали сложное сопоставление типов в EF Core 3.0 Preview7 или проблема в моих изогнутых руках?

Обновление 2. Выложен вопрос о репозитории проекта github.

1 ответ

Решение

WithOwner Свободный API все еще не документирован (нормальный для программного обеспечения предварительного просмотра), но он следует API отношений (HasOne / HasMany / WithOne, WithMany) шаблон для свойства навигации - если у вас есть свойство навигации, передайте либо лямбда-выражение, либо имя свойства (строка)). Если у вас нет свойства навигации, ничего не передавайте.

Вы можете видеть это для одного из WithOwner Перегрузки с использованием команды "Перейти к определению" - это VS:

//
// Summary:
//     Configures the relationship to the owner.
//     Note that calling this method with no parameters will explicitly configure this
//     side of the relationship to use no navigation property, even if such a property
//     exists on the entity type. If the navigation property is to be used, then it
//     must be specified.
//
// Parameters:
//   ownerReference:
//     The name of the reference navigation property pointing to the owner. If null
//     or not specified, there is no navigation property pointing to the owner.
//
// Returns:
//     An object that can be used to configure the relationship.
public virtual OwnershipBuilder<TEntity, TDependentEntity> WithOwner([CanBeNullAttribute] string ownerReference = null);

То же самое показывает В.С. Интеллисенс.

Так что в вашем случае просто используйте WithOwner()например,

modelBuilder.Entity<Car>().OwnsOne(e => e.Volume).WithOwner()
    . /* configuration goes here */
Другие вопросы по тегам