0

Я работаю над несколько простым приложением InventoryTracker MVC5, в котором у меня возникают некоторые проблемы с получением моей LocalDatabase до Seed().MVC EntityFramework Code-First Migrations - Seed() Ошибка с DbUpdateException?

Когда я бегу update-database команду на моем коде ниже, я получаю исключение следующим образом на линии context.INV_Types.AddRange(invTypes):

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code. Additional information: An error occurred while updating the entries. See the inner exception for details.

Внутренняя Exception: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.


КОД:

internal sealed class Configuration : DbMigrationsConfiguration<InventoryTracker.DAL.InventoryTrackerContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(InventoryTracker.DAL.InventoryTrackerContext context) 
    { 
     if (System.Diagnostics.Debugger.IsAttached == false) 
     { 
      System.Diagnostics.Debugger.Launch(); 
     } 

     List<INV_Locations> invLocs = getLocations(); 
     context.INV_Locations.AddRange(invLocs); 
     List<INV_Manufacturers> invManufacturers = getManufacturers(); 
     context.INV_Manufacturers.AddRange(invManufacturers); 
     List<INV_Models> invModels = getModels(); 
     context.INV_Models.AddRange(invModels); 
     List<INV_Statuses> invStatuses = getStatuses(); 
     context.INV_Statuses.AddRange(invStatuses); 
     List<INV_Types> invTypes = getTypes(); 
     context.INV_Types.AddRange(invTypes); // EXCEPTION? 
     List<INV_Vendors> invVendors = getVendors(); 
     context.INV_Vendors.AddRange(invVendors); 

     context.SaveChanges(); // Was told I needed to Save the other seeds before the Assets to ensure primary keys are created in the other tables? 

     List<INV_Assets> invAssets = getAssets(); 
     context.INV_Assets.AddRange(invAssets); 

     context.SaveChanges(); 
    } 

    private List<INV_Types> getTypes() 
    { 
     List<INV_Types> testTypes = new List<INV_Types> 
     { 
      new INV_Types 
      { 
       Id = 1, 
       type_description = "Server", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Types 
      { 
       Id = 2, 
       type_description = "IP Phone", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Types 
      { 
       Id = 3, 
       type_description = "Monitor", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testTypes; 
    } 

    private List<INV_Assets> getAssets() 
     { 
      List<INV_Assets> testAssets = new List<INV_Assets> 
      { 
       new INV_Assets 
       { 
       Id = 1, 
       ip_address = "10.10.135.38", 
       mac_address = "10.10.177.44", 
       note = "", 
       owner = "John Smith", 
       cost = 35, 
       po_number = "G348", 
       invoice_number = 1447, 
       serial_number = "JX14582Y", 
       asset_tag_number = "293548195023", 
       //acquired_date = Convert.ToDateTime(10212014), 
       acquired_date = DateTime.ParseExact("10212014", "MMddyyyy", CultureInfo.InvariantCulture), 
       disposed_date = null, 
       created_by = "Admin", 
       created_date = DateTime.Now, 
       Location_Id = 1, 
       Manufacturer_Id = 1, 
       Model_Id = 1, 
       Status_Id = 2, 
       Type_Id = 3, 
       Vendor_Id = 3 
      } 
     }; 
     return testAssets; 
    } 

У кого-нибудь есть идеи относительно того, что может быть причиной этого в структуре моего Seed() для INV_Types?

Я думал, что это может быть что-то, где мне нужно, чтобы сохранить изменения в контексте до getTYpes(), но добавление context.SaveChanges() после .AddRange(invStatuses) приводит только к одной и той же ошибки с этим новым context.SaveChanges() ??

Я включил мои другие методы семенных ниже, чтобы помочь, если кто-то видит меня с видом:

#region Seed Locations 
    private List<INV_Locations> getLocations() 
    { 
     List<INV_Locations> testLocations = new List<INV_Locations> 
     { 
      new INV_Locations 
      { 
       Id = 1, 
       location_dept = "IT", 
       location_room = "Server", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Locations 
      { 
       Id = 2, 
       location_dept = "Break Room", 
       location_room = "Kitchen", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Locations 
      { 
       Id = 3, 
       location_dept = "Accounting", 
       location_room = "Conference", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testLocations; 
    } 
    #endregion 

    #region Seed Manufacturers 
    private List<INV_Manufacturers> getManufacturers() 
    { 
     List<INV_Manufacturers> testManufacturers = new List<INV_Manufacturers> 
     { 
      new INV_Manufacturers 
      { 
       Id = 1, 
       manufacturer_description = "Samsung", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Manufacturers 
      { 
       Id = 2, 
       manufacturer_description = "MITEL", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Manufacturers 
      { 
       Id = 3, 
       manufacturer_description = "Oracle", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testManufacturers; 
    } 
    #endregion 

    #region Seed Models 
    private List<INV_Models> getModels() 
    { 
     List<INV_Models> testModels = new List<INV_Models> 
     { 
      new INV_Models 
      { 
       Id = 1, 
       model_description = "XTERAV12", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Models 
      { 
       Id = 2, 
       model_description = "5330", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Models 
      { 
       Id = 3, 
       model_description = "Sunblade 6000", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testModels; 
    } 
    #endregion 

    #region Seed Statuses 
    private List<INV_Statuses> getStatuses() 
    { 
     List<INV_Statuses> testStatuses = new List<INV_Statuses> 
     { 
      new INV_Statuses 
      { 
       Id = 1, 
       status_description = "AVAILABLE", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Statuses 
      { 
       Id = 2, 
       status_description = "SIGNEDOUT", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Statuses 
      { 
       Id = 3, 
       status_description = "RECYCLED", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Statuses 
      { 
       Id = 4, 
       status_description = "AUCTIONED", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testStatuses; 
    } 
    #endregion 

    #region Seed Types 
    private List<INV_Types> getTypes() 
    { 
     List<INV_Types> testTypes = new List<INV_Types> 
     { 
      new INV_Types 
      { 
       Id = 1, 
       type_description = "Server", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Types 
      { 
       Id = 2, 
       type_description = "IP Phone", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Types 
      { 
       Id = 3, 
       type_description = "Monitor", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testTypes; 
    } 
    #endregion 

    #region Seed Vendors 
    private List<INV_Vendors> getVendors() 
    { 
     List<INV_Vendors> testVendors = new List<INV_Vendors> 
     { 
      new INV_Vendors 
      { 
       Id = 1, 
       vendor_name = "Oracle", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Vendors 
      { 
       Id = 2, 
       vendor_name = "Centriq", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      }, 
      new INV_Vendors 
      { 
       Id = 3, 
       vendor_name = "Samsung", 
       created_by = "Admin", 
       created_date = DateTime.Now 
      } 
     }; 
     return testVendors; 
    } 
    #endregion 

EDIT:

Как IronMan84 указывал, я по ошибке копирования -pasted, где у меня было несколько экземпляров каждого объекта с тем же значением Id (например, 1, 2, 1 вместо 1, 2, 3). Однако ошибка все еще сохраняющаяся только теперь в следующей строке:

 context.INV_Vendors.AddRange(invVendors); 

     context.SaveChanges(); // DbUpdateException! 

     List<INV_Assets> invAssets = getAssets(); 

edit2: Добавлена ​​Внутренней Exception детали к ошибке первоначально в списке. The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.

EDIT3: Для того, чтобы лучше диагностировать проблему, я попытался добавить context.SaveChanges() после каждого из .AddRange() вызовов, но самый первый экземпляр после context.INV_Locations.AddRange(invLocs) результатов в той же ошибки:

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code. Additional information: An error occurred while updating the entries. See the inner exception for details.

Внутренняя Exception: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.

Я могу только представить, что это ссылка на мой getLocations(), устанавливающий [created_date] значение DateTime.Now, но я не уверен, в чем проблема?

В моей модели я определил свойство, как:

[Required] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] 
    public DateTime created_date { get; set; } 
+0

Что говорит внутреннее исключение? – tschmit007

ответ

2

2 Типов в методе getTypes() имеет Id значения 1. EF делает не так, как этот конфликт и таким образом бомбы вне.

EDIT: Ошибка, что вы упоминали в комментариях (The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.) вызывается только объект, имеющий DateTime свойство, текущее значение устанавливается на дату до 1 января 1753 года (скорее всего, он установлен в DateTime.MinValue, который составляет 1/1/0001).

Что вызывает то, что в том, что EF отображает C# 's DateTime типа для datetime типа SQL, (в отличие от datetime2, что может вернуться к 1/1/0001), который имеет это требование минимальной даты, указанной выше. Когда вы пытаетесь сохранить объект с датой до 1/1/1753 SQL считает, что вы пытаетесь сохранить datetime2 в столбце типа datetime и взорвали.

Решение состоит в том, чтобы отладить его и выяснить, какие записи имеют свойства, которые по-прежнему установлены на плохую дату (например, DateTime.MinValue), и отредактируйте код, чтобы отредактировать эти свойства соответствующим образом.

+0

Спасибо за ответ IronMan. Я попался в старую ошибку копирования-пасты ... Я надеялся, что это решит мою проблему, но теперь я получаю ту же ошибку в 'context.SaveChanges()' сразу после 'AddRange (invVendors)' и перед ' getAssets() 'call (для большей ясности см. раздел« Редактирование »). –

+2

Что говорит внутреннее исключение? – IronMan84

+0

Вот это: 'Преобразование типа данных datetime2 в тип данных datetime привела к превышению значения. \ R \ nПриложение завершено.' –

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