c# - 一个或多个实体的 MVC5 验证失败。有关详细信息,请参阅 'EntityValidationErrors' 属性

标签 c# asp.net-mvc entity-framework asp.net-identity

我似乎无法使用我的种子方法获取更新数据库来填充我的数据库。

我正在使用 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();

    }




}

最佳答案

如错误所述,您必须检查实体验证错误,

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);
        }
    }
}

关于c# - 一个或多个实体的 MVC5 验证失败。有关详细信息,请参阅 'EntityValidationErrors' 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36258700/

相关文章:

c# - MVC5 中模拟 ConfirmEmailAsync 和其他 UserManager 方法的接口(interface)

c# - 进行通用 MVC API 查询

c# - EF 中的动态搜索表达式问题

c# - 如何在自定义类中创建名称数组

javascript - 允许 MVC 将 Controller 操作响应视为静态内容

asp.net-mvc - 使 ASP.NET 捆绑指定 CSS 捆绑的 media=screen

c# - 如何使用 LinQ 搜索不在 char 数组中的字符串

c# - Mahapps 1.3 对话框和 Avalon.Wizard

c# - 如何在 EntityFramework 中按 DateTime.Date 分组

entity-framework - 是否可以从代码优先 POCO 类生成 EF 数据模型 (edmx)?