Asp.net mvc 为数据库设定种子时出错?(MVC4应用程序,EF5,代码优先)
我已成功地在项目中添加了一个新迁移,但当我在Package Manager控制台中运行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.
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; }
...