按照实体代码优先的方法播种我的数据库
本文关键字:方法 我的 数据库 实体 代码 | 更新日期: 2023-09-27 18:10:40
因此,在我使用向导从现有数据库创建模型之后,我的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
s和context.Score
。我得到的错误是
SnakeGame.Models。ApplicationDbContext不包含定义对…
,我正在想办法解决它。我的Migrations文件夹的完整代码可以在这里看到。我认为所有这些代码优先迁移的尝试都把我的项目搞砸了。div。
你的实体都是在snakdb上下文中定义的,而不是ApplicationDbContext,所以把你的种子改为
protected override void Seed(SnakeGame.Migrations.SnakeDb context)
...
逆向工程之后,你可能想把东西移到你想要的应用结构中。对于我来说,我将poco复制到一个单独的"实体"项目中,然后将EF和上下文内容移动到"数据"项目中,但您也可以将它们移动到不同的文件夹中。
其次,由于您对数据库进行了反向工程,因此您将需要一个基线初始迁移。您可以注释掉Up()和Down()代码,也可以通过
生成。Add-Migration InitialCreate –IgnoreChanges
https://msdn.microsoft.com/en-us/data/dn579398.aspx option1
您是否使用迁移更新了您的DB ??在我的项目
中有一个命令示例/*
* 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
所以,如果你已经更新了你的数据库,我建议你完全删除你当前的数据库,并使用迁移命令重新创建它…
希望能有所帮助。