Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 为数据库设定种子时出错?(MVC4应用程序,EF5,代码优先)_Asp.net Mvc_Entity Framework_Asp.net Mvc 4_Ef Code First_Entity Framework Migrations - Fatal编程技术网

Asp.net mvc 为数据库设定种子时出错?(MVC4应用程序,EF5,代码优先)

Asp.net mvc 为数据库设定种子时出错?(MVC4应用程序,EF5,代码优先),asp.net-mvc,entity-framework,asp.net-mvc-4,ef-code-first,entity-framework-migrations,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Ef Code First,Entity Framework Migrations,我已成功地在项目中添加了一个新迁移,但当我在Package Manager控制台中运行update database时,我收到:错误种子设定权限:更新条目时出错。有关详细信息,请参阅内部异常。 详情如下: PM> update-database Specify the '-Verbose' flag to view the SQL statements being applied to the target database. No pending explicit migrations.

我已成功地在项目中添加了一个新迁移,但当我在Package Manager控制台中运行
update database
时,我收到:
错误种子设定权限:更新条目时出错。有关详细信息,请参阅内部异常。

详情如下:

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.Exception: Error Seeding Privileges: An error occurred while updating the entries. See the inner exception for details.
   at PersonalPortfolio.Migrations.Configuration.Seed(PortfolioContext context) in c:\James-Projects\TRAINING\PersonalPortfolio\PersonalPortfolio\Migrations\Configuration.cs:line 56
   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)
PM>更新数据库
指定'-Verbose'标志以查看应用于目标数据库的SQL语句。
没有挂起的显式迁移。
运行种子法。
系统异常:错误设定种子权限:更新条目时出错。有关详细信息,请参见内部异常。
在c:\James Projects\TRAINING\PersonalPortfolio\PersonalPortfolio\Migrations\Configuration.cs中的PersonalPortfolio.Migrations.Configuration.Seed(PortfolioContext上下文)处:第56行
在System.Data.Entity.Migrations.DbMigrationsConfiguration`1.OnSeed(DbContext上下文)中
位于System.Data.Entity.Migrations.DbMigrator.SeedDatabase()处
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase()处
位于System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations,String targetMigrationId,String lastMigrationId)
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
位于System.Data.Entity.Migrations.Dbmigator.UpdateInternal(字符串targetMigration)
在System.Data.Entity.Migrations.DbMigrator.c__DisplayClassc.b__b()中
位于System.Data.Entity.Migrations.Dbmigator.EnsureDatabaseExists(操作必须成功才能访问数据库)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作必须成功才能使用数据库)
位于System.Data.Entity.Migrations.DbMigrator.Update(字符串targetMigration)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串targetMigration)
在System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()中
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
位于System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner)
位于System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串targetMigration,布尔力)
在System.Data.Entity.Migrations.UpdateDatabaseCommand.c__DisplayClass2.b__0()中
位于System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作命令)
以下是我的特权种子方法:

namespace PersonalPortfolio.Migrations
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using PersonalPortfolio.Models;

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

        protected override void Seed(PersonalPortfolio.DAL.PortfolioContext context)
        {
            // The different Privileges a Visitor can have
            #region Privileges
            try
            {
                var privileges = new List<Privileges>
                {
                    new Privileges { Privilege = "Root" },              // ME
                    new Privileges { Privilege = "Admin" },             // Admin
                    new Privileges { Privilege = "Outsider" },          // Random Net Visitor
                    new Privileges { Privilege = "Client" },            // Tommy Peterson, Joe Dorris, Jim Dorris
                    new Privileges { Privilege = "Client Primary" }     // Joe Dorris, Jim Dorris
                };

                foreach (Privileges priv in privileges)
                {
                    var recordInDb = context.Privileges.Where(p => p.Privilege == priv.Privilege).FirstOrDefault();
                    if (recordInDb == null)
                    {
                        context.Privileges.Add(priv);
                    }
                }
                context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error Seeding Privileges: " + ex.InnerException.Message);
            }
            #endregion
        }
    }
}
namespace PersonalPortfolio.Migrations
{
使用制度;
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Data.Entity.Migrations;
使用System.Linq;
使用个人投资组合模型;
内部密封类配置:DBMigOptionsConfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=假;
}
受保护的覆盖无效种子(PersonalPortfolio.DAL.PortfolioContext上下文)
{
//访问者可以拥有的不同特权
#地区特权
尝试
{
var特权=新列表
{
新特权{Privilege=“Root”},//ME
新权限{Privilege=“Admin”},//Admin
新特权{Privilege=“outsier”},//随机网络访问者
新特权{Privilege=“Client”},//汤米·彼得森、乔·多里斯、吉姆·多里斯
新特权{Privilege=“Client Primary”}//Joe Dorris,Jim Dorris
};
foreach(特权中的特权)
{
var recordInDb=context.Privileges.Where(p=>p.Privilege==priv.Privilege).FirstOrDefault();
if(recordInDb==null)
{
context.Privileges.Add(priv);
}
}
SaveChanges();
}
捕获(例外情况除外)
{
抛出新异常(“错误种子设定权限:+ex.InnerException.Message”);
}
#端区
}
}
}

有人知道如何解决这个问题吗?

您的特权类是什么样子的?我猜您的主键不叫“Id”,这是EF希望自动将其创建为标识列所需的。如果是这种情况,则需要将其重命名为“Id”或使用[Key]注释指定自己的主键名称

public class Privileges
    {
        public int Id { get; set; }
        ...


为什么不试试if,这个
if(recordInDb.Any())
?如果没有
FirstOrDefault()
,您能否得到更具体的错误,即找出异常的类型而不是一般的系统异常?@markpsmith,我如何推断这些信息?另外,@Guillelon,当我键入
recordInDb时,我没有收到intellisense的选项。
对于
Any()
@markpsmith,使用
ex.InnerException.InnerException.Message获得它。
错误种子特权:违反主键约束“PK\u dbo.Privileges”。无法在对象“dbo.Privileges”中插入重复的密钥。重复的键值为(0)。语句已终止。我是否需要以某种方式在种子中设置ID,或者是否可以将其设置为自动递增,因为它是关键字段?
public class Privileges
    {
        [Key]
        public int MyId { get; set; }
         ...