Пользовательский ключ с автоинкрементом - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть объект с

entity.Property(f => f.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

, потому что по какой-то причине мне нужно ввести некоторые идентификаторы вручную.Можно ли автоматически добавить следующий доступный идентификатор (int), если идентификатор не указан (равен 0)?

Он должен работать как поле Identity, но с возможностью определения идентификатора вручную в некоторых специальныхслучаях.

РЕДАКТИРОВАТЬ:

Можно ли определить идентификаторы вручную, когда мы переносим данные из существующей базы данных в новую с полем идентификатора какпервичный ключ нового?

После некоторых разговоров выясняется, что нам нужно будет добавлять записи с пользовательским идентификатором только 1 или 2 раза в год.

Решение, предоставленное KamilFolwarczny интересен, но лучше ли использовать этот хак или (если миграция с определенными идентификаторами возможна), переносить данные 1 или 2 раза в год с обслуживанием?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Это скорее хак, чем кристально чистое решение.Это можно сделать с помощью аннотации [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

. Вы можете создать что-то вроде этого:

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [Key]
    public int Id
    {
        get {
            if (_id == 0)
            {
                using (Context context = new Context())
                {
                    return context.DbSetOfEntity.OrderBy(s => s.Id).ToList().Last().Id + 1;
                }
            }
            else
            {
                return _id;
            }
        }
        set {
             _id = value;
        }
    }

    [NotMapped]
    private int _id;

Теперь, если вы предоставите Id из формы, это будет сохранять указанный вами Id как обычно.Однако, если вы оставили Id пустым (0 из-за int).Он найдет последний использованный Id в таблице и увеличит его на 1.

Как только объект будет создан, он сохранит свое значение, будет ли он сгенерирован или указан.

Редактировать

Если вам нужно вставлять строки с пользовательским идентификатором только несколько раз в год, тогда это может быть жизнеспособным решением.

0 голосов
/ 25 сентября 2018

Нет готового решения.Если вы хотите сделать это, вам нужно сделать свой собственный Id-присваиватель значения.Как только мы сначала используем код EF, лучше переопределить метод SaveChanges.Там вы можете проверить состояние и тип сущности, и если это ваша сущность с добавленным состоянием, то вы проверяете ее Id.Если он равен 0, вам нужно получить максимальный идентификатор из БД и увеличить его.И вам нужно проверить дубликат Id при назначении вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...