2016-03-28 35 views
2

我似乎無法使用Seed方法獲取update-database來填充我的數據庫。MVC5一個或多個實體的驗證失敗。有關更多詳細信息,請參閱'EntityValidationErrors'屬性

我正在用EF應用程序編寫MVC4,現在正在使用EF升級到MVC5。以前在MVC4中,我不得不創建一個名爲User.cs的類,但在具有Identity的MVC5中,我們需要我們的User類從IdentityUser派生。

我使用完全相同的代碼和我一樣與MVC4配置文件,只是改變:

var users = new List<User> 

var users = new List<ApplicationUser> 

new User{ FirstMi.... 

new ApplicationUser { FirstMi.... 

錯誤是上線61是這裏

users.ForEach(S => context.Users.AddOrUpdate(p值=> p.FirstMidName,S)); context.SaveChanges()

PM> Update-Database 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
No pending explicit migrations. 
Running Seed method. 
System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. 
    at System.Data.Entity.Internal.InternalContext.SaveChanges() 
    at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 
    at System.Data.Entity.DbContext.SaveChanges() 
    at RecreationalServicesTicketingSystem.Migrations.Configuration.Seed(ApplicationDbContext context) in C:\Users\Jason\Documents\Visual Studio 2015\Projects\RecreationalServicesTicketingSystem\RecreationalServicesTicketingSystem\Migrations\Configuration.cs:line 62 
    at System.Data.Entity.Migrations.DbMigrationsConfiguration`1.OnSeed(DbContext context) 
    at System.Data.Entity.Migrations.DbMigrator.SeedDatabase() 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase() 
    at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) 
    at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() 
    at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force) 
    at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0() 
    at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. 

IdentityModel.cs(片段包含我的用戶類)

public class ApplicationUser 
: IdentityUser<int, ApplicationUserLogin, 
    ApplicationUserRole, ApplicationUserClaim>, IUser<int> 
{ 
    public async Task<ClaimsIdentity> 
     GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager) 
    { 
     var userIdentity = await manager 
      .CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     return userIdentity; 
    } 


    public bool IsAdministrator { get; set; } 
    [StringLength(50, MinimumLength = 1)] 

    public string LastName { get; set; } 
    [StringLength(50, MinimumLength = 1, ErrorMessage = "First name cannot be longer than 50 characters.")] 

    [Column("FirstName")] 
    public string FirstMidName { get; set; } 

    public string FullName 
    { 
     get { return FirstMidName + " " + LastName; } 
    } 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
    public DateTime EnrollmentDate { get; set; } 
    public int DepartmentID { get; set; } 
    [ForeignKey("DepartmentID")] 
    public virtual Department Department { get; set; } 
    public int DepotID { get; set; } 
    [ForeignKey("DepotID")] 
    public virtual Depot Depot { get; set; } 
    public virtual ICollection<Ticket> Tickets { get; set; } 
} 

Configuration.cs(種子法)

internal sealed class Configuration : DbMigrationsConfiguration<RecreationalServicesTicketingSystem.Models.ApplicationDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(ApplicationDbContext context) 
    { 
     var departments = new List<Department> 
     { 
      new Department { DepartmentID = 1, DepartmentName = "IT"}, 
      new Department { DepartmentID = 2, DepartmentName = "Menzit Admin" }, 
      new Department { DepartmentID = 3, DepartmentName = "Human Resources"}, 
      new Department { DepartmentID = 4, DepartmentName = "Mechanics" }, 
      new Department { DepartmentID = 5, DepartmentName = "Directors" }, 
      new Department { DepartmentID = 6, DepartmentName = "Operations"} 

     }; 
     departments.ForEach(s => context.Departments.AddOrUpdate(p => p.DepartmentName, s)); 
     context.SaveChanges(); 


     var depots = new List<Depot> 
     { 
      new Depot { DepotID = 1, DepotName = "Porana"}, 
      new Depot { DepotID = 2, DepotName = "Far North"}, 
      new Depot { DepotID = 3, DepotName = "Horowhenua"}, 
      new Depot { DepotID = 4, DepotName = "Manawatu"}, 
      new Depot { DepotID = 5, DepotName = "Silverdale"}, 
      new Depot { DepotID = 6, DepotName = "Christchurch"}, 

     }; 
     depots.ForEach(s => context.Depots.AddOrUpdate(p => p.DepotName, s)); 
     context.SaveChanges(); 

      var users = new List<ApplicationUser> 
    { 
     new ApplicationUser { FirstMidName = "Jason", LastName = "Wan", 
      EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1, DepotID = 1,IsAdministrator = true}, 
     new ApplicationUser { FirstMidName = "Andy", LastName = "Domagas", 
      EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1,DepotID = 1,IsAdministrator = true}, 
     new ApplicationUser { FirstMidName = "Denis", LastName = "Djohar", 
      EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1 ,DepotID = 1,IsAdministrator = true }, 
     new ApplicationUser { FirstMidName = "Christine", LastName = "West", 
      EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 2, DepotID = 3,IsAdministrator = false}, 

    }; 

      users.ForEach(s => context.Users.AddOrUpdate(p => p.FirstMidName, s)); 
      context.SaveChanges(); <--ERROR HERE 

      users.ForEach(s => context.Users.AddOrUpdate(p => p.LastName, s)); 
      context.SaveChanges(); 



     var categories = new List<Category> 
     { 
      new Category {CategoryID = 0001, CategoryName = "Desktop"}, 
      new Category {CategoryID = 0002, CategoryName = "Mobile"}, 
      new Category {CategoryID = 0003, CategoryName = "Menzits"}, 
      new Category {CategoryID = 0004, CategoryName = "XMPRO"}, 
      new Category {CategoryID = 0005, CategoryName = "Con-X"}, 
      new Category {CategoryID = 0006, CategoryName = "Promapp"}, 
      new Category {CategoryID = 0007, CategoryName = "QGIS"}, 
     }; 
     categories.ForEach(s => context.Categories.AddOrUpdate(p => p.CategoryName, s)); 
     context.SaveChanges(); 

     var tickets = new List<Ticket> 
     { 
      new Ticket { 
       UserID = users.Single(s => s.LastName == "Wan").Id, //UserID 
       CategoryID = categories.Single(c => c.CategoryName == "Con-X").CategoryID, 
       Issue = ("Con-X Login Error"), 
       Priority = Priority.High 
      }, 
      new Ticket { 
       UserID = users.Single(s => s.LastName == "Wan").Id, //UserID 
       CategoryID = categories.Single(c => c.CategoryName == "Desktop").CategoryID, 
       Issue = ("Can't remote access C0123"), 
       Priority = Priority.Med 
      }, 
     }; 


     foreach (Ticket e in tickets) 
     { 
      var ticketInDataBase = context.Tickets.Where(
       s => 
        s.User.Id == e.UserID && //UserID 
        s.Category.CategoryID == e.CategoryID).SingleOrDefault(); 
      if (ticketInDataBase == null) 
      { 
       context.Tickets.Add(e); 
      } 
     } 
     context.SaveChanges(); 

    } 




} 
+1

'ApplicationUser'的'UserName'屬性是必填字段。在你的Seed方法中填充這個。 –

回答

4

一個簡單的解決方案是這一行添加到觀察窗口:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors 

,但我的猜測是錯誤來自ApplicationUser用戶名屬性,您需要給它一個價值,同時增加一個新的用戶:)

我希望它有幫助。

+0

這太好了,謝謝!我意識到重寫SaveChanges並捕獲和擴展異常細節。但我目前正在使用EF數據庫優先(edmx)方法,並不想混淆那些生成的類和什麼。這就像一個魅力! – Jiveman

+0

老兄你必須與那些生成的類混淆,但不要愚蠢地做,只是修改用於生成類的文件:) – theMost1ted

3

的錯誤說的是你必須檢查實體驗證錯誤,

try 
     { 
      db.Entity.Add(entity); 
      db.SaveChanges(); 
     } 
     catch (DbEntityValidationException dbEx) 
     { 
      foreach (var validationErrors in dbEx.EntityValidationErrors) 
      { 
       foreach (var validationError in validationErrors.ValidationErrors) 
       { 
        System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
       } 
      } 
     } 
相關問題