微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Entity Framework Core实体配置中的ValueObject支持

如何解决Entity Framework Core实体配置中的ValueObject支持

我对实体模型中的ValueObject配置有关于Entity Framework Core的问题。

我正在使用3.1.9版的Entity Framework Core(https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/3.1.9

多年来,我一直使用Entity Framework 6.0+和.NET编写丰富的域模型,并使用EF对其进行映射而没有问题。

最近我一直在使用Entity Framework Core转移到.NET Core,但是当我拥有复杂而丰富的域模型时,我没有看到相同的配置实体模型的支持

让我们以简化模型及其配置方法为例。

假设我们有一个具有以下架构的用户表。

CREATE TABLE User
(
    Id   UNIQUEIDENTIFIER NOT NULL,Name VARCHAR(128)     NOT NULL
)

域模型是这样定义的。

public class User
{
    public Guid Id { get; set; }
    public Name Name { get; set; }
}

public class Name
{
    public string Value { get; set; }
}

实体配置如下

public class UserEntityTypeConfiguration : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.ToTable("User");
        builder.HasKey(x => x.Id);
        builder.Property(x => x.Id).HasColumnName("Id");
        builder.OwnsOne(x => x.Name,buildAction => { buildAction.Property(x => x.Value).HasColumnName("Name"); });
    }
}

现在可以使用...我可以无错误查询模型,并且Name ValueObject将正确创建。

但是,由此生成sql看起来像这样。

SELECT TOP(1) [p].[Id],[t].[Id],[t].[Name]
FROM [User] AS [p]
LEFT JOIN (
    SELECT [p0].[Id],[p0].[Name]
    FROM [User] AS [p0]
    WHERE [p0].[Name] IS NOT NULL
) AS [t] ON [p].[Id] = [t].[Id]
WHERE [p].[Id] = NEWID()

有什么方法可以配置它以避免这种不必要的左联接?

我能够使用EF 6.0做到这一点,并使用我的值对象创建更好的配置并获得更好的sql,但似乎无法使用EF Core找到合适的方法。任何人都知道在使用复杂的域模型和具有实体配置的值对象时可以做到这一点的更好方法吗?

注意,这是一个非常简单的情况。

我的域模型更大,更复杂,因此,如果EF Core支持不止于此,我可能会回到EF 6.0。

编辑 我更新到以下RC版本

https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.SqlServer/5.0.0-rc.2.20475.6

https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/5.0.0-rc.2.20475.6

这似乎可以解决我提到的这个查询

现在看起来像我期望的那样

[18:08:59 DBG] Executing DbCommand [Parameters=[@__get_Item_0='94a2fe3a-1c6d-47df-86db-e235dc3f0edf' (Nullable = true)],CommandType='"Text"',CommandTimeout='30']
SELECT TOP(1) [u].[Id],[u].[Name]
FROM [User] AS [u]
WHERE [u].[Id] = @__get_Item_0

这是3.1.9中的错误还是设计功能

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。