Значения по умолчанию не устанавливаются в таблице SQL Server при создании в режиме Entity Framework - PullRequest
0 голосов
/ 24 мая 2019

У меня есть много таблиц, которые содержат значения по умолчанию, такие как CreatedDateTime (getutcdate()). Но прямо сейчас вместо этого сохраняется значение 0001-01-01 00: 00: 00.0000000.

https://stackoverflow.com/a/35093135/7731479 -> это не эффективно, я должен сделать это для каждой таблицы вручную для каждого обновления модели базы данных (edmx). Как я могу автоматически обновить все StoreGeneratedPattern до Computed? Или почему он не принимает вычисляется автоматически?

https://stackoverflow.com/a/43400053/7731479 -> ado.net создает все свойства, и я не могу сгенерировать снова CreatedDateTime.

Есть ли автоматическое решение?

Я использую Entity Framework и ado.net.

Person person = new Person()
{
    Id = id,
    Name = name,
};
AddToPerson(person);
SaveChanges();

Я хочу использовать выше. Я не хочу использовать следующее и назначать CreatedDeteTime снова, потому что он назначен в MSSQL со значением по умолчанию getutcdate ().

Person person = new Person()
{
    Id = id,
    Name = name,
    CreatedDeteTime = DateTime.UtcNow;
};
AddToPerson(person);
SaveChanges();

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Настроенное ограничение по умолчанию таблицы SQL Server будет только применяться, если у вас есть оператор SQL INSERT, который пропускает рассматриваемый столбец.

Таким образом, если вы вставите

 INSERT INTO dbo.Person(Id, Name) VALUES (42, "John Doe")

->, тогда для вашего CreatedDateTime будет автоматически установлено значение GETUTCDATE().

К сожалению , если вы отобразили этот столбец в своем классе модели EF, то это не , что происходит.Если вы создаете экземпляр Person в своем коде C #, а столбец CreatedDateTime фактически является частью класса модели, тогда EF будет использовать что-то подобное для вставки нового человека:

 INSERT INTO dbo.Person(Id, Name, CreatedDateTime) VALUES (42, "John Doe", NULL)

и поскольку теперь NULL фактически предоставляется для столбца CreatedDateTime, это значение, которое будет сохранено - или, может быть, это пустая строка - несмотря ни на что, указан столбец в операторе INSERT и, следовательно, сконфигурированное ограничение по умолчанию не применяется .

Поэтому, если вы хотите, чтобы SQL Server включал значения по умолчанию, вам необходимо убедиться, что не для предоставления столбцов, о которых идет речь, в операторе INSERT.Это можно сделать следующим образом:

  1. с отдельным классом модели только для вставок, который не включает эти столбцы, к которым относится вопрос - например, имеет сущность NewPerson,он также отображается в таблицу Person, но состоит, например, только из Name и ID.Так как эти свойства отсутствуют, EF не может и не будет генерировать оператор INSERT с ними - поэтому ограничения SQL Server по умолчанию сработают в

  2. сопоставлении метода INSERTв хранимую процедуру SQL Server и обработайте вставку внутри этой процедуры, явно указав , а не , указав те столбцы, для которых вы хотите использовать значения по умолчанию

0 голосов
/ 24 мая 2019

Может быть, я ошибаюсь, но у меня есть вопрос.Если вам нужно сохранить дату по умолчанию в вашей таблице БД, почему вы пытаетесь сохранить другую дату с уровня программы?Я имею в виду, что создать процедуру легко, а на уровне процедуры сохранить дату.Что-то вроде (выберите getdate () ...).

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