按照实体代码优先的方法播种我的数据库

本文关键字:方法 我的 数据库 实体 代码 | 更新日期: 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 

所以,如果你已经更新了你的数据库,我建议你完全删除你当前的数据库,并使用迁移命令重新创建它…

希望能有所帮助。