Есть ли "элегантный" способ присвоить определенному свойству значение по умолчанию?
Может быть, DataAnnotations, что-то вроде:
[DefaultValue("true")]
public bool Active { get; set; }
Спасибо.
entity-framework
ef-code-first
default-value
Марьино-крк
источник
источник
this.Active = true;
? Я думаю, что значение БД будет иметь приоритет при извлечении, но будьте осторожны, если new'ing затем присоединяет сущность для обновления без извлечения в первую очередь, так как отслеживание изменений может увидеть это, как вы хотите обновить значение. Комментарий, потому что я не использовал EF в течение долгого времени, и я чувствую, что это выстрел в темноте.public bool Inactive { get; set; }
JesОтветы:
Вы можете сделать это, вручную отредактировав код первой миграции:
источник
Active
дляtrue
при созданииEvent
объекта , а также. Значение по умолчанию всегдаfalse
указывается в свойстве bool, не допускающем значения NULL, поэтому, если оно не изменено, это структура сущностей будет сохранять в БД. Или я что-то упустил?Это было какое-то время, но оставляю записку для других. Я добился того, что нужно с помощью атрибута, и я украсил поля моего модельного класса этим атрибутом, как я хочу.
Получил помощь этих 2 статей:
Что я сделал:
Определить атрибут
В «OnModelCreating» контекста
В кастомном SqlGenerator
Затем в конструкторе конфигурации миграции зарегистрируйте пользовательский генератор SQL.
источник
[SqlDefaultValue(DefaultValue = "getutcdate()")]
каждую сущность. 1) Просто удалитеmodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) ДобавитьmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Приведенные выше ответы действительно помогли, но дали только часть решения. Основная проблема заключается в том, что как только вы удалите атрибут значения по умолчанию, ограничение на столбец в базе данных не будет снято. Таким образом, предыдущее значение по умолчанию останется в базе данных.
Вот полное решение проблемы, включая удаление ограничений SQL на удаление атрибутов. Я также повторно использую нативный
DefaultValue
атрибут .NET Framework .использование
Чтобы это работало, вам нужно обновить файлы IdentityModels.cs и Configuration.cs
Файл IdentityModels.cs
Добавить / обновить этот метод в вашем
ApplicationDbContext
классеФайл Configuration.cs
Обновите ваш
Configuration
конструктор класса, зарегистрировав собственный генератор Sql, например:Затем добавьте пользовательский класс генератора Sql (вы можете добавить его в файл Configuration.cs или в отдельный файл)
источник
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
атрибут? Если так, то почему? В моих тестах это, казалось, не оказывало никакого эффекта.Свойства вашей модели не обязательно должны быть автоматическими, даже если это проще. А атрибут DefaultValue на самом деле является только информативными метаданными. Принятый здесь ответ является одной из альтернатив подходу конструктора.
против
Это будет работать только для приложений, создающих и потребляющих данные с использованием этого определенного класса. Обычно это не проблема, если код доступа к данным централизован. Чтобы обновить значение во всех приложениях, необходимо настроить источник данных для установки значения по умолчанию. Ответ Деви показывает, как это можно сделать, используя миграцию, SQL или любой другой язык, на котором говорит ваш источник данных.
источник
Что я сделал, я инициализировал значения в конструкторе сущности
Примечание: атрибуты DefaultValue не будут устанавливать значения ваших свойств автоматически, вы должны сделать это самостоятельно
источник
После комментария @SedatKapanoglu я добавляю все свои подходы, которые работают, потому что он был прав, просто использование свободного API не работает.
1- Создайте собственный генератор кода и переопределите Generate для ColumnModel.
2- Назначьте новый генератор кода:
3 - Используйте свободный API для создания аннотации:
источник
Это просто! Просто комментируйте с необходимыми.
результирующая миграция будет:
Если вы хотите true, измените defaultValue на true в миграции перед обновлением базы данных
источник
true
?Я признаю, что мой подход избегает всей концепции «Code First». Но если у вас есть возможность просто изменить значение по умолчанию в самой таблице ... это намного проще, чем длины, которые вы должны пройти выше ... Мне просто лень делать всю эту работу!
Кажется, что оригинальная идея постеров сработает:
Я думал, они просто ошиблись, добавив кавычки ... но, увы, такой интуитивности нет. Другие предложения были слишком большими для меня (при условии, что у меня есть привилегии, необходимые для того, чтобы войти в таблицу и внести изменения ... где не каждый разработчик будет в каждой ситуации). В конце концов я просто сделал это по старинке. Я установил значение по умолчанию в таблице SQL Server ... Я имею в виду, действительно, уже достаточно! ПРИМЕЧАНИЕ: я также проверил выполнение надстройки и обновления базы данных, и изменения застряли.
источник
Просто перегрузите конструктор по умолчанию класса Model и передайте любой соответствующий параметр, который вы можете или не можете использовать. Этим вы можете легко предоставить значения по умолчанию для атрибутов. Ниже приведен пример.
источник
Предположим, у вас есть имя класса с именем Products и поле IsActive. просто вам нужен конструктор create:
Тогда ваше значение по умолчанию IsActive - True!
Edite :
если вы хотите сделать это с SQL, используйте эту команду:
источник
В ядре EF, выпущенном 27 июня 2016 года, вы можете использовать свободный API для установки значения по умолчанию. Перейдите в класс ApplicationDbContext, найдите / создайте имя метода OnModelCreating и добавьте следующий свободный API.
источник
В .NET Core 3.1 вы можете сделать следующее в классе модели:
В DbContext OnModelCreating вы добавляете значение по умолчанию.
В результате чего в базе данных следующее
Примечание: если у вас нет nullable (bool?) Для вашей собственности, вы получите следующее предупреждение
источник
Я обнаружил, что достаточно просто использовать Auto-Property Initializer для свойства объекта, чтобы выполнить работу.
Например:
источник
Хм ... Сначала я делаю БД, и в этом случае это на самом деле намного проще. EF6 верно? Просто откройте вашу модель, щелкните правой кнопкой мыши столбец, для которого вы хотите установить значение по умолчанию, выберите свойства, и вы увидите поле «DefaultValue». Просто заполните это и сохраните. Он установит код для вас.
Ваш пробег может варьироваться в зависимости от кода, хотя я не работал с этим.
Проблема многих других решений заключается в том, что, хотя они могут работать изначально, как только вы перестраиваете модель, она выбрасывает любой пользовательский код, вставленный вами в сгенерированный компьютером файл.
Этот метод работает путем добавления дополнительного свойства в файл edmx:
И добавив необходимый код в конструктор:
источник
Установите значение по умолчанию для столбца в таблице в MSSQL Server, а в коде класса добавьте атрибут, например так:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
за ту же недвижимость.
источник