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

时间:2015-08-31 06:54:59

标签: c# asp.net asp.net-mvc entity-framework ef-migrations

所以在我让向导从现有数据库创建模型后,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.IPscontext.BannedIPcontext.Score的每一个上都收到了错误。我得到的错误是

  

SnakeGame.Models.ApplicationDbContext不包含定义   为......

我试图找出解决方法。可以看到我的迁移文件夹的完整代码here。我认为通过代码优先迁移的所有这些尝试,我已经完全搞砸了我的项目。等等。

2 个答案:

答案 0 :(得分:2)

您的实体都在SnakeDb上下文中定义,而不是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

答案 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 

因此,如果您已经更新了数据库,我建议您完全删除当前数据库并使用迁移命令重新创建它...

希望它有所帮助。