Проблема с отображением собственных типов в 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 */