Primitive Obsession - строго идентифицированный int ID с автоматическим приращением - PullRequest
2 голосов
/ 30 октября 2019

Как получить строго типизированный 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 по умолчанию. Возможно ли это каким-либо образом?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Я бы посоветовал не разрешать EF иметь дело со строго типизированным Id. Он не справляется с этим хорошо, и будут случаи, когда он будет пытаться фильтровать вещи в памяти.

Но вы можете иметь оба свойства, одно для запросов EF и одно для всех остальных.

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

Это протекает, но это работает.

0 голосов
/ 30 октября 2019

Честно говоря, использование строго типизированных переменных с SQL в EF - это настоящая боль. Лучшее объяснение, которое я видел, можно найти в этом сообщении в блоге Эндрю Лока .

Суть проблемы? Использование строго типизированных значений может привести к фильтрации запроса (предложение WHERE ID = значение) на клиенте, что потребует от процесса извлечения всех записей из БД для локального выбора.

Суть решения? Использование ValueConverter для приведения строго типизированного значения к правильному значению SQL Server.

Подробная информация. См. Ссылку на статью, чтобы узнать, как это сделать.

...