Проблема обновления вставки фреймворка сущностей! - PullRequest
0 голосов
/ 10 марта 2011

У меня проблема с структурой сущностей. Тем более я не могу сделать операцию вставки или обновления. Сообщение об ошибке:

An error occurred while updating the entries. See the inner exception for details.System.Data.SqlClient.SqlException (0x80131904): The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
 at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
 at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
 at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
 at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
 at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
 at System.Data.SqlClient.SqlDataReader.get_MetaData()
 at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
 at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
 at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
 at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
 at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
 at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
 at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
 at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
 at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)

Вы можете мне помочь?

Пример кода:

ProductGroups group;
if (txtProductGroupName.Text.Trim() != null)
{
    group = new ProductGroups();
    group.ProductGroupName = txtProductGroupName.Text.Trim();
    context.ProductGroups.AddObject(group); 
    context.SaveChanges();
    context.AcceptAllChanges();
    lblState.ForeColor = Color.Red;
    lblState.Text = "Ürün grubu kaydedildi...";

}
else 
{
    lblState.ForeColor = Color.Red; 
    lblState.Text = "Ürün grubu ismini bos geçmeyiniz";
}

Таблица ProductGroups определяется 5 столбцами:

  • [ProductGroupID] int
  • [ProductGroupName] varchar (100)
  • [ProductGroupComment] varchar (1000)
  • [CreatedOn] datetime
  • [Удалено] datetime

Ответы [ 4 ]

7 голосов
/ 10 марта 2011

Вы не заполняете данные CreatedOn и DeletedOn в добавленном экземпляре группы. EF, вероятно, отправил значение по умолчанию .NET, которое является 1/1/0001. Это привело к исключению, потому что минимальное допустимое значение SQL для столбца DATETIME - 01.01.1753. Либо введите значение в своем коде, либо используйте DATETIME2 в базе данных.

2 голосов
/ 30 октября 2013

Добавление к ответу BenSwayne:

Если обновленная сущность не поступает из базы данных, вам придется указать платформе сущности не обновлять свойство CreatedOn.Для этого обновите код следующим образом:

if (entry.State == EntityState.Added)
{
     e.CreatedOn = currentTime;
}
else
{
    // handle updates of objects not originating from the database
    var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
    ObjectStateEntry entryToUpdate = objectStateManager.GetObjectStateEntry(entry.Entity);
    entryToUpdate.RejectPropertyChanges("CreatedOn");
}
2 голосов
/ 16 марта 2011

Посмотри пожалуйста этот пост. Это может быть полезно для вас - Использование типа данных sql даты и EF4 .

0 голосов
/ 15 августа 2012

В то время как текущие ответы объясняют, почему вы сталкиваетесь с этой ошибкой, никто не предложил решение или лучшие практики.

Самый правильный ответ здесь заключается в том, что вы должны либо обнулять поля даты в модели, либо указывать значение во всех вставках!

Вам не нужно использовать тип данных DateTime2, это просто дополнительные затраты и не решает проблему. И вы, конечно, не хотите, чтобы сгенерированные сервером значения по умолчанию для любого из этих полей.

Я бы предложил, чтобы CreatedOn был установлен во время вставки, а DeletedOn должен иметь значение null.


Следует отметить, что структура сущности DbContext предоставляет метод SaveChanges (), который можно переопределить в своем классе контекста. Этот метод можно использовать для перехвата сохранений EF и вставки данных, таких как поля аудита. У меня есть базовый класс модели, который содержит все общие данные аудита, такие как CreatedOn, от которых наследуются все мои модели. Затем я могу обновить даты аудита для любой записи в моем контексте следующим образом (используя EF 4.3 DbContext):

public override int SaveChanges()
{
    var currentTime = DateTime.UtcNow;

    foreach (var entry in ChangeTracker.Entries<Models.Abstract.ModelBase>())
    {
        // If this is a new entity add to the Db set the CreatedOn field to now
        if (entry.State == EntityState.Added)
        {
            entry.Entity.CreatedOn = currentTime;
        }

        // Always set the modified by/on
        entry.Entity.ModifiedOn = currentTime;
    }

    return base.SaveChanges();
}
...