Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2

Задать "CURRENT_TIMESTAMP" в EF Code-First SQLite атрибутами в свойстве

24.01.2022, 13:13. Показов 2251. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу как добавить значение по умолчание "CURRENT_TIMESTAMP" к полю при создании БД в Code First EF.
Нужно получить такое поле: "TimeStamp" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
Добавить "руками" получается без проблем.

Можно создать и в OnModelCreating:
C#
1
2
3
    modelBuilder.Entity<PcmFileInfoEntity>()
        .Property(pcm => pcm.TimeStamp)
        .HasDefaultValueSql("CURRENT_TIMESTAMP");
Но интерес именно относительно атрибутов к свойству.
Возможно ли это и, если да, то как?
Проект Core 6 с использование NuGet пакета Microsoft.EntityFrameworkCore.Sqlite.

Мои неудачные попытки:

C#
1
2
3
4
5
6
7
        // [SqlDefaultValue(DefaultValue = "getutcdate()")]
        //[SqlDefaultValue(DefaultValue = "date('now')")] 
        [SqlDefaultValue(DefaultValue = "CURRENT_TIMESTAMP")] 
        [Timestamp]
        [Required]
        [Index(IsUnique = true)]
        public DateTime TimeStamp { get; set; }
Добавлено через 2 часа 44 минуты
Забыл написать атрибут [SqlDefaultValue] SQLite.CodeFirst.SqlDefaultValueAttribute из пакета msallin:SQLite.CodeFirst.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2022, 13:13
Ответы с готовыми решениями:

VS Code перестраивает строку с атрибутами тега input в столбик
Здравствуйте Установил Visual Studio Code, подключил расширения, а теперь заметил глюк. В формах при создании строк с input-тегами при...

Code First - выбор: Microsoft.EntityFrameworkCore.Sqlite, Microsoft.Data.Sqlite, System.Data.SQLite и др.
Работаю с БД очень редко. Поэтому опыт маленький и знания обрывочные. Стоит задача в Решении Framework 4.8 создать репозиторий на...

Ошибка ToastNotifier, System.InvalidOperationException: "Невозможно задать в свойстве Owner объект Window,
private Notifier notifier = new Notifier(cfg =&gt; { cfg.PositionProvider = new WindowPositionProvider( ...

20
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
24.01.2022, 14:27
Элд Хасп, попробуйте создать таблицу в БД и посмотреть, какой EF создаст для нее класс.
1
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
24.01.2022, 14:35
Ну вроде бы

C#
1
[DefaultValue("CURRENT_TIMESTAMP")]
Добавлено через 5 минут
Если не будет работать, то вот тут вариант реализации или объяснения.

EF 7 set initial default value for DateTime column
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 17:58
Цитата Сообщение от Igr_ok Посмотреть сообщение
попробуйте создать таблицу в БД и посмотреть, какой EF создаст для нее класс.
1. Строю базу в SSMS + заполнение ее данными за день, потом пишу клиент за неделю
или
2. Строю базу в EF+миграции за месяц, потом пишу клиент за неделю

Как-то так
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
24.01.2022, 21:38  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Ну вроде бы
Это пробовал.
В коде выше показал этот вариант.

Цитата Сообщение от HF Посмотреть сообщение
Если не будет работать, то вот тут вариант реализации или объяснения.
Там вроде все решения не через атрибуты.
Как решить - без атрибутов я знаю.
Выше дал рабочий вариант.

Добавлено через 10 минут
Цитата Сообщение от Igr_ok Посмотреть сообщение
попробуйте создать таблицу в БД и посмотреть, какой EF создаст для нее класс.
Если через Студию, то не получается.
Выдаёт, что версия FW не содержит нужной информации.
Делаю как по ссылке: https://docs.microsoft.com/ru-... amework-cs
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
24.01.2022, 23:07
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это пробовал.
В коде выше показал этот вариант.
Это не то. Мой - встроенный атрибут, ваш - пакетный.
По пакетному может не работать, если не инициализировать в конвенции этот атрибут и всю логику.
C#
1
SqlDefaultValueAttributeConvention.Apply(builder);
То есть у вас всё это точно подключено? Уточню уж чтобы наверняка.

И, если я не ошибаюсь, то после создания миграции, в файле, у изменённой модели, должна появиться команда по заполнению дефолтного значения. Мы раньше поэтому не парились, обходили весь этот сложный путь и просто в миграции прописывали значение, руками.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
24.01.2022, 23:17  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Мой - встроенный атрибут, ваш - пакетный.
Встроенный это какой.
Из какого пространранства?

Добавлено через 1 минуту
Цитата Сообщение от HF Посмотреть сообщение
То есть у вас всё это точно подключено? Уточню уж чтобы наверняка.
Точно не подключено.

Добавлено через 3 минуты
Цитата Сообщение от HF Посмотреть сообщение
И, если я не ошибаюсь, то после создания миграции
Я не создавал миграции.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
25.01.2022, 08:59
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Точно не подключено.
Я не создавал миграции.
Я начинаю сомневаться в том что знал.
Но какой смысл в этом атрибуте? Как вы представляете себе его функциональную часть?
Это же аналог свойства колонки в БД, а не препроцессор значений. Как он должен выполнить предзаполенение пустого значение при запросе вставки, обновления и т.п.? Он же не будет проверять "если свойство NULL, то сначала выполню в БД команду из атрибута, получу значение и вставлю через рефлекию в значение". Разве нет?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
25.01.2022, 09:04
HF, так оно только для миграций и может быть нужно. Хотя нужны ли сами миграции - вопрос.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.01.2022, 11:15  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Но какой смысл в этом атрибуте? Как вы представляете себе его функциональную часть?
Code First - Запустил приложение, если нет БД она создалась.
Задачи изменения БД не возникает.

Добавлено через 1 минуту
В созданной БД это поле должно быть "TimeStamp" TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP.
Больше ничего не надо.

Добавлено через 44 секунды
Цитата Сообщение от HF Посмотреть сообщение
Разве нет?
Да.
Но причём здесь миграции?

Добавлено через 47 секунд
Миграция - это получение из БД с одной схемой БД с другой схемой.
Мне это не нужно.
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
25.01.2022, 11:32
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Миграция - это получение из БД с одной схемой БД с другой схемой.
При CodeFirst первоначальное создание БД и есть миграция.
Проще создать БД и устанавливать её с приложением, БД SQLite это ведь просто файл.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.01.2022, 13:03  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Проще создать БД и устанавливать её с приложением, БД SQLite это ведь просто файл.
Вопрос не про то как это сделать в принципе.
Можно и образ начальной БД заливать, можно в OnModelCreating задать, как я показал в топе.
Меня интересует можно ли это сделать установкой атрибута.
Создание TimeeStamp это же очень частая задача и не ужели для этого нет атрибута?
Сама БД без проблем поддерживает CURRENT_TIMESTAMP.

То есть я не понимаю почему не работают атрибуты [Timestamp], [SqlDefaultValue] , [DefaultValue].
Мне кажется, что я что-то не так делаю, вот что именно ЧТО НЕ ТАК я делаю я и хочу выяснить.

Цитата Сообщение от HF Посмотреть сообщение
Это не то. Мой - встроенный атрибут, ваш - пакетный.
Вот так [System.ComponentModel.DefaultValue("CURRENT_TIMESTAMP")] тоже не задаёт.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
25.01.2022, 13:12
Цитата Сообщение от Usaga Посмотреть сообщение
так оно только для миграций и может быть нужно.
Я про это и говорю, но возникло подозрение что Элд Хасп ожидал что это должно влиять на значения при обычной работе.
Именно что миграция в каком то виде и должна отработать. Теперь осталось понять почему оно не подхватывает этот атрибут. Тут я пока пас.

Добавлено через 57 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сама БД без проблем поддерживает CURRENT_TIMESTAMP.
Вы проверяли не функцией а обычным значением? Ну поставьте что-то более осмысленное, типа 42 для инт значения. (Добавьте новую колонку и проверьте )
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.01.2022, 13:26  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Ну поставьте что-то более осмысленное, типа 42 для инт значения.
Не понял... Зачем?
Мне нужно получить Штамп Времени который БД сама ставит, а не пользователь задаёт.
Как здесь поможет 42 для инт?
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
25.01.2022, 13:58
Элд Хасп, а если так попробовать?

If you are using EF, adorn the property with Data Annotation [Timestamp], then go to the overrided OnModelCreating, inside your context class, and add this Fluent API code:

C#
1
2
3
4
5
modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
It will make a default value to every data that will be insert into this table.

How to have an automatic timestamp in SQLite?
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
25.01.2022, 14:18
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как здесь поможет 42 для инт?
Здесь никак. Мне такие эксперименты помогают выявить причину проблемы. Если, например в данном случае, создание записи со значением успешно работало, то проблема в использовании функций.

Добавлено через 1 минуту
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
а если так попробовать?
Он сразу уточнил, что через FluentAPI всё работает.
1
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
25.01.2022, 14:21
Цитата Сообщение от HF Посмотреть сообщение
что через FluentAPI всё работает.
А, ну да, не внимательно почитал начало
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
25.01.2022, 15:48
Если здесь не причина то что
- CodeFirst
- SQLite
, то помоему я нашёл причину.

Generated Values
https://docs.microsoft.com/en-... nnotations

1) ради прикола попробовать атрибут DatabaseGenerated
C#
1
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
2) но вот тут отдельная прям секция про работу с датами и временем
https://docs.microsoft.com/en-... generation
и кроме FluentAPI нет вариантов. И комментарий.
Although stored computed columns seem like a good solution for managing last-updated timestamps, databases usually don't allow specifying functions such as GETDATE() in a computed column.
И я склоняюсь к тому что например в том же SQLite пакете нет поддержки этого атрибута.
Если бы проверить на значении "42", то можно было бы и убедиться.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.01.2022, 19:19  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Мне такие эксперименты помогают выявить причину проблемы. Если, например в данном случае, создание записи со значением успешно работало, то проблема в использовании функций.
Попробовал:
C#
1
2
3
4
5
        [DefaultValue(12345)]
        public int Number  { get; set; }
 
        [DefaultValue("Some Text")]
        public string Text { get; set; }

Не вышло:
SQL
1
2
3
CREATE TABLE "PcmFileInfos" (
    "Number" INTEGER NOT NULL,
    "Text" TEXT NULL,
Добавлено через 6 минут
Цитата Сообщение от HF Посмотреть сообщение
И я склоняюсь к тому что например в том же SQLite пакете нет поддержки этого атрибута.
Я тоже.
Но по мне как-то это очень странно, а таком довольно старом и широко распространённом инструменте.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
26.01.2022, 04:48
Элд Хасп, на вашем месте, когда какая-то фича ну очень нужна, но она вроде как есть и не работает, я бы поступил следующим образом:
* полез бы в исходники в поисках тестов, где проверяется нужное мне поведение
* полез бы на github в issues искать вопрос по этой теме или создал бы оный
* полез бы в исходники искать реализацию нужного поведения (маловероятно)

К первым двум пунктам я регулярно прибегал, когда знакомился с тем же linq2db. И это дало свои результаты. Может быстро выясниться, что не смотря на наличие нужных атрибутов, данное поведение для SQLite просто не реализовали.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2022, 04:48
Помогаю со студенческими работами здесь

Как задать самоудаление батнику с атрибутами скрытый, системный и только для чтения?
Как задать самоудаление батнику с атрибутами скрытый, системный и только для чтения? del &quot;%~f0&quot; Не получается. Пробывал...

Моделирование SQLite EF Code First
У меня есть класс Teacher и SubjectTeacherDetail. Связь в них такая: ** private static void...

XamlParseException: "Binding" нельзя задать в свойстве
Всем привет. Столкнулся с проблемой: XamlParseException: &quot;Binding&quot; нельзя задать в свойстве &quot;Nick&quot; типа...

Использование типов DataContract с другими атрибутами. Прокси класс не генерирует DataContract с атрибутами
Такая проблема. Три дня провозился с сервисом, клиент которого по непонятной мне тогда причине кидал Exception, хотя все было написано...

Изменить базу данных с MySQL на SQLite в проекте с Entity Framework code first
Добрый день, подскажите пожалуйста: Имеется проект C# приложение windows form с entity framework code first на борту. Entity использует...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru