原始痴迷-具有自动增量的强类型int ID

问题描述 投票:2回答:2

如何获取强类型ID ...

public sealed class FileUploadId
{
    public int Value { get; }

    public FileUploadId(int value)
    {
        Value = value;
    }
}

...在我的FileUpload类中使用的...

public class FileUpload : EntityBase, IAggregateRoot
{
    private FileUpload() { /* Required by EF */ }

    public FileUpload(string name, string relativePath, FileUploadType type, string contentType, long? size = null)
    {
        /* Guard clauses... */

        Id = new FileUploadId(0);

        /* Other properties... */
    }

    public FileUploadId Id { get; }

    /* Other properties... */
}

...使用身份(int自动递增)?

我在ValueGeneratedOnAdd()中尝试了TypeConifiguration,但没有成功...

public class FileUploadTypeConfig : IEntityTypeConfiguration<FileUpload>
{
    public void Configure(EntityTypeBuilder<FileUpload> builder)
    {
        builder.HasKey(x => x.Id);
        builder.Property(x => x.Id).HasConversion(x => x.Value, x => new FileUploadId(x)).ValueGeneratedOnAdd();

        /* Other configurations... */
    }
}

我知道HiLo算法还有另一个选择。但是我想让它以默认的int id增量工作。这有可能吗?

c# sql-server .net-core entity-framework-core domain-driven-design
2个回答
0
投票

老实说,在EF中将强类型变量与SQL一起使用确实是一件很痛苦的事情。我见过的最好的解释可以在this blog post by Andrew Lock中找到。

问题的核心?使用强类型的值可能会导致在客户端上执行查询过滤(WHERE ID = value子句),这要求从数据库检索所有记录的过程才能在本地执行选择。

解决方案的核心?使用ValueConverter将强类型值转换为正确的SQL Server值。

细节广泛。有关如何执行的详细信息,请参见所引用的文章。


0
投票

我建议不要让EF处理强类型ID。它不能很好地处理它,并且在某些情况下会尝试过滤内存中的内容。

但是您可以同时拥有两个属性,一个属性用于EF查询,另一个属性用于其他所有内容。

class FileUpload
{
    public int InternalId { get; private set; }
    public FileUploadId Id 
    {
        get { return new FileUploadId(InternalId); }
        set { InternalId = value.Value; }
    }
}

它泄漏了,但是有效。

© www.soinside.com 2019 - 2024. All rights reserved.