2015-06-24 5 views
19

Я использую EF6 для хранения экземпляров класса report в моей базе данных. База данных уже содержит данные. Скажем, я хотел бы добавить свойство report,Перенос кода: как установить значение по умолчанию для нового свойства?

public class report { 
    // ... some previous properties 

    // ... new property: 
    public string newProperty{ get; set; } 
} 

Теперь, если я иду в консоль пакет-менеджера и выполнить

add-migration Report-added-newProperty 
update-database 

я получить файл в папку «/ Миграции» Добавление newProperty столбец к таблице. Это прекрасно работает. Однако в старых элементах базы данных значение для newProperty теперь является пустой строкой. Но я хочу, чтобы это было, например, «старое».

Итак, мой вопрос: как установить значения по умолчанию для новых свойств (любого типа) в сценарии миграции (или в другом месте)?

ответ

31

Если вы видите сгенерированный код миграции вы увидите AddColumn

AddColumn("dbo.report", "newProperty", c => c.String(nullable: false)); 

Вы можете добавить defaultValue

AddColumn("dbo.report", "newProperty", 
      c => c.String(nullable: false, defaultValue: "old")); 

Или добавьте defaultValueSql

AddColumn("dbo.report", "newProperty", 
      c => c.String(nullable: false, defaultValueSql: "GETDATE()")); 
+4

Было бы хорошо, если он правильно вытащил в [DefaultValue (хуг)] атрибута, как это определено в коде первой модели. Вместо того, чтобы помнить, какие столбцы нужны, каждый раз при добавлении-миграции; после чего необходимо отредактировать сгенерированный файл, а затем нормальный запуск базы данных обновлений для этого измененного файла. Интересно, можно ли переопределить это неразумное поведение .... Я не могу поверить, что никто не улучшил это. Разумеется, я не единственный, кто разочарован этим с помощью модели AspNet Identity по умолчанию ... LockoutEnabled, EmailConfirmed, AccessFailedCount. все hardcoded, все проблемы – Barry

+1

Это не похоже на работу с MySQL-EF. «defaultValue» не устанавливает значение, а «defaultValueSql» создает исключение («геометрия текста блобера или столбец json не могут иметь значение по умолчанию») ... единственное обходное решение - использовать raw SQL. :( – Efrain

3

Вы должны изменить строку в ваш сценарий миграции, который добавляет ty/column вот так:

AddColumn("dbo.reports", "newProperty", c => c.String(nullable: false, defaultValue: "test")); 
-5

Я обнаружил, что просто использовать Инициализатор автоистирирования для свойства entity достаточно, чтобы выполнить работу.

Например:

public class Thing { 
    public bool IsBigThing { get; set; } = false; 
} 
+0

Что не так с этим? –

Смежные вопросы