6

我已经从 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/break-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.VolumeandorderProfiles.StartPoint和. orderProfiles.EndPointnull

但是,在 Preview5 中,此代码运行良好。微软开发人员是否破坏了 EF Core 3.0 Preview7 中的复杂类型映射或我弯曲的双手中的问题?

更新 2. 在 github 项目 repo 上发布了一个问题。

4

1 回答 1

7

WithOwnerfluent API 仍然没有记录(对于预览软件来说是正常的),但它遵循导航属性的关系 API ( HasOne/ HasMany/ WithOne, WithMany) 模式 - 如果您有导航属性,则传递 lambda 表达式或属性的名称(字符串))。如果您没有导航属性,请不要传递任何内容。

您可以看到,WithOwner使用 Go To Definition 命令的重载之一是 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);

VS Intellisense 也显示了相同的内容。

所以在你的情况下,只需使用WithOwner(),例如

modelBuilder.Entity<Car>().OwnsOne(e => e.Volume).WithOwner()
    . /* configuration goes here */
于 2019-07-26T12:37:25.070 回答