Присвоение идентификаторов сущностям с EntityFramework 4 - PullRequest
9 голосов
/ 13 апреля 2011

Я бы хотел реализовать поддержку генерации идентификаторов по умолчанию для моих сущностей.

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

Я выполняю миграцию данных из устаревшей модели данных (EntityFrameworkмодель, созданная из старой базы данных) во вновь созданную (сначала модель) модель EntityFramework.Давайте назовем старую модель A и новую модель T.

Как правило, я хотел бы, чтобы сущности T получали свои идентификаторы, установленные при сохранении (все они int64), для долгосрочного использованияновая модель.

В настоящее время я явно назначаю идентификаторы T-сущностей на основе Id соответствующей сущности A, из которой я выполняю миграцию.Это так, что результаты миграции легко проверить.

Однако, хотя я могу назначить идентификатор для объекта T тому же идентификатору, что и для объекта A в моей процедуре миграции, после сохранения объектов значения Id изменились.

Есть лиспособ переопределить метод сохранения по умолчанию для всех сущностей в модели T, чтобы значение id назначалось только в том случае, если оно еще не установлено в сущности до его сохранения?

Я смотрел на некоторые другиеEntityFramework / Id вопросы здесь, но, на мой взгляд, никто из них не задает то же самое.

Спасибо за любые выводы.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

После продолжительного поиска, чтения и обсуждения с некоторыми друзьями, которые знают о EF больше, чем я в настоящее время, я думаю, что единственный практичный и устойчивый способ достичь того, что я ищу в текущей реализации Entity Framework, - это создать пользовательский поставщик Entity Framework, как описано в этом сообщении в блоге .

Должен ли я найти время, чтобы реализовать это, я должен разобраться, но я подумал, что по крайней мере заверну этот ответ. Пользовательский поставщик также позволил бы реализовать атрибуты дешифрования при чтении / шифровании при записи для сущностей.

Тем не менее, обе эти функции я надеюсь увидеть в будущем выпуске EntityFramework.

3 голосов
/ 13 апреля 2011

Я вижу, вы упомянули, что вы используете Model First.Однако у меня есть пример Code First, который может помочь.

В сущности T у вас есть атрибут [Key] в свойстве id, нет?Если это так, вы можете использовать другой атрибут, DatabaseGeneratedAttribute , для принудительной установки идентификатора.

public class SomeEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int? SomeEntityID { get; set; }
}

Кроме того, существует вызов API Fluent для достижения аналогичного результата:

public class YourContext : DbContext
{
    protected override void OnModelCreating( DbModelBuilder dbModelBuilder )
    {
        base.OnModelCreating( dbModelBuilder );

        var config = dbModelBuilder.Entity<SomeEntity>();
        config.Property(e => e.SomeEntityID).HasDatabaseGeneratedOption( DatabaseGeneratedOption.None);
    }
}
...