2016-03-28 19 views
2

Seedメソッドを使用してデータベースを作成するupdate-databaseを取得できないようです。MVC5 1つまたは複数のエンティティの検証に失敗しました。詳細については、「EntityValidationErrors」プロパティを参照してください。

私はEFアプリケーションでMVC4をコーディングしていましたが、現在はEFでMVC5にアップグレードしています。以前はMVC4ではUser.csというクラスを作成しなければなりませんでしたが、Identityを持つMVC5ではIdentityUserから派生するUserクラスが必要でした。

私はMVC4の設定ファイルを行なったし、ちょうど変更として、私はまったく同じコードを使用しています:

var users = new List<User> 

var users = new List<ApplicationUser> 

new User{ FirstMi.... 

new ApplicationUser { FirstMi.... 

エラーここで

users.ForEach(S => context.Users.AddOrUpdate(P => p.FirstMidName、S))は、ライン61上にあります。 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 Database-First(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); 
       } 
      } 
     }