所以在我让向导从现有数据库创建模型后,Configuration.cs
是
namespace SnakeGame.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
internal sealed class Configuration : DbMigrationsConfiguration<SnakeGame.Models.ApplicationDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(SnakeGame.Models.ApplicationDbContext context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
}
}
我的数据库模型是
namespace SnakeGame.Migrations
{
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
public partial class SnakeDB : DbContext
{
public SnakeDB()
: base("name=SnakeDB")
{
}
public virtual DbSet<BannedIP> BannedIPs { get; set; }
public virtual DbSet<GameLog> GameLogs { get; set; }
public virtual DbSet<IP> IPs { get; set; }
public virtual DbSet<Score> Scores { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<GameLog>()
.Property(e => e.logText)
.IsUnicode(false);
modelBuilder.Entity<IP>()
.HasMany(e => e.BannedIPs)
.WithRequired(e => e.IP)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Score>()
.Property(e => e.name)
.IsUnicode(false);
}
}
}
尝试遵循已注释的说明,我将protected override void Seed(SnakeGame.Models.ApplicationDbContext context)
的正文更改为
context.IPs.AddOrUpdate(
i => i.id,
new IP { id = 1, byte1 = 4, byte2 = 35, byte3 = 241, byte4 = 179 },
new IP { id = 2, byte1 = 172, byte2 = 16, byte3 = 254, byte4 = 1 }
);
context.BannedIPs.AddOrUpdate(
i => i.id,
new BannedIP { id = 1, ipId = 1}
);
context.Score.AddOrUpdate(
s => s.id,
new Score { id = 1, score1 = 12, name = "John Skeet" },
new Score { id = 2, score1 = 1923, name = "Steve Ballmer"}
);
但我在context.IPs
,context.BannedIP
和context.Score
的每一个上都收到了错误。我得到的错误是
SnakeGame.Models.ApplicationDbContext不包含定义 为......
我试图找出解决方法。可以看到我的迁移文件夹的完整代码here。我认为通过代码优先迁移的所有这些尝试,我已经完全搞砸了我的项目。等等。
答案 0 :(得分:2)
您的实体都在SnakeDb上下文中定义,而不是ApplicationDbContext,因此请将种子更改为
protected override void Seed(SnakeGame.Migrations.SnakeDb context)
...
逆向工程后,您可能希望将内容移动到您希望应用程序具有的任何结构中。对我来说,我将POCO复制到一个单独的“实体”项目,然后将EF和上下文内容移动到“数据”项目,但您也可以将它们移动到不同的文件夹中。
其次,由于您对数据库进行了逆向工程,因此您需要进行基线初始迁移。您可以注释掉Up()和Down()代码,也可以通过
生成Add-Migration InitialCreate –IgnoreChanges
答案 1 :(得分:0)
您是否使用迁移更新了数据库?我在我的proyects中有一个命令的例子
/*
* X DATA CONTEXT
*/
//this command enables migrations
Enable-Migrations -StartUpProjectName X.Web -ProjectName X.DAL.Repository -EnableAutomaticMigrations -ContextTypeName XDataContext -Verbose -MigrationsDirectory:XDataContextMigrations
//this command create a new migration, please set up the name of the DBMigration
Add-Migration [NAME] -StartUpProjectName X.Web -ProjectName X.DAL.Repository -ConfigurationTypeName XUpdateDatabaseInitializer -Verbose
//this command updates the current database
Update-Database -StartUpProjectName X.Web -ProjectName X.DAL.Repository -ConfigurationTypeName XUpdateDatabaseInitializer -Verbose
//this command rollbacks the current Database to Specific Target applying Down() methods
Update-Database –TargetMigration: SpecificTargetMigrationName -StartUpProjectName X.Web -ProjectName X.DAL.Repository -ConfigurationTypeName XUpdateDatabaseInitializer -Verbose
因此,如果您已经更新了数据库,我建议您完全删除当前数据库并使用迁移命令重新创建它...
希望它有所帮助。