代码首先创建表(Code first create tables)

2019-08-18 16:08发布

我下面这个教程中,我试图在USERPROFILE表中添加了一些新的栏目。 我试图创建一个新表。

 public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<TestTabel> TestTabel { get; set; }
}

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Mobile { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

[Table("TestTabel")]
public class TestTabel
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int TestId { get; set; }
    public string TestName { get; set; }
    public string TestMobile { get; set; }
}

比我尝试更新与更新数据库命令控制台的数据库,我得到这个错误信息:

目前已经在数据库中名为“用户配置”的对象。

新列,其中不添加,也不表。

我在想什么?

[编辑]我做的附加迁移和更新数据库命令,这是出落得(不得不做了更新的数据库命令两次,第二次有详细)

PM> Add-Migration
cmdlet Add-Migration at command pipeline position 1
Supply values for the following parameters:
Name: test
Scaffolding migration 'test'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201304011714212_test' again.
PM> Update-Database
The project 'MVC4SimpleMembershipCodeFirstSeedingEF5' failed to build.
PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying code-based migrations: [201304011714212_test].
Applying code-based migration: 201304011714212_test.
Running Seed method.
PM> Update-Database -verbose
Using StartUp project 'MVC4SimpleMembershipCodeFirstSeedingEF5'.
Using NuGet project 'MVC4SimpleMembershipCodeFirstSeedingEF5'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'aspnet-MVC4SimpleMembershipCodeFirstSeedingEF5' (DataSource: ., Provider: System.Data.SqlClient, Origin: Configuration).
No pending code-based migrations.
Running Seed method.
PM>

[/编辑]

Configuration.cs:

    namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Migrations
{
    internal sealed class Configuration : DbMigrationsConfiguration<UsersContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

    protected override void Seed(UsersContext context)
    {
        WebSecurity.InitializeDatabaseConnection(
            "DefaultConnection",
            "UserProfile",
            "UserId",
            "UserName", autoCreateTables: true);

        if (!Roles.RoleExists("Administrator"))
            Roles.CreateRole("Administrator");

        if (!WebSecurity.UserExists("test"))
            WebSecurity.CreateUserAndAccount(
                "test",
                "password",
                new { Mobile = "+19725000374", FirstName = "test", LastName = "test" });

        if (!Roles.GetRolesForUser("test").Contains("Administrator"))
            Roles.AddUsersToRoles(new[] { "test" }, new[] { "Administrator" });
    }
  }
}

在过滤器文件夹1 CS文件:

namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Filters
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, 

    Inherited = true)]
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
    {
        private static SimpleMembershipInitializer _initializer;
        private static object _initializerLock = new object();
        private static bool _isInitialized;

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Ensure ASP.NET Simple Membership is initialized only once per app start
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }
    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
            }
        }
    }
  }
}

连接字符串:

<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

最后迁移:

namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

public partial class test : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.TestTabel",
            c => new
                {
                    TestId = c.Int(nullable: false, identity: true),
                    TestName = c.String(),
                    TestMobile = c.String(),
                })
            .PrimaryKey(t => t.TestId);

    }

    public override void Down()
    {
        DropTable("dbo.TestTabel");
    }
  }
}

Answer 1:

我只是要抛开一切在这里作为一个步行通过让你的代码优先和迁移去 -攻击,可能会或可能不会发生的各种问题。 注:代码优先已被证明是非常可靠的-并能与活的情况制定出以及-你只需要知道你在做什么。

最有可能的,你的迁移和数据库基本上都是出不同步。

您现有的移民试图对数据库的旧副本运行 - 与UPS /这是为“空分贝”我想优化的起伏。

您需要运行迁移(附加迁移)对,你连接到数据库的拷贝-这将创建一个“差异”,只是上最新的DB(始终确保课程的备份 ,因为它可能会跌落/改变等)。

或者,如果可能的话,清空你的数据库 - 然后重新开始。

或者,如果现场Db的-创建迁移-和运行Update-Database -Script您的开发机器上-以生成完整的Db的-或改变(这是所有非常粗糙,您需要调整您的情况)。 然后通过运行脚本适用于您的“实况中Db。

您还可以查看我先前的职位上同步...

MVC3和代码首先迁移- “模型支持的‘嗒嗒’语境已经改变,因为数据库创建”

编辑:
还要检查这个答案AutomaticMigrationsEnabled或真或假?

而如果它是确定你做事的方式添加AutomaticMigrationsEnabled = true;Configuration (也下了迁移文件夹-为您创建)..

情侣步骤我总是做清洁迁移:

(良好的备份第一)
- 启用 - 迁移-force(第一次只 - 这将删除configuration.cs任何“seed'-ING那里!)
- AutomaticMigrationsEnabled = TRUE;
- 删除现有项目从手工迁移(\迁移)
- 在这一点上重建项目
- 添加迁移初始
- 更新 - 数据库-Force -Verbose

......以后(后续迁移):
- 添加迁移SomeOther1
- 更新 - 数据库-Force -Verbose
...提供你保持你的数据库同步 - 即小心'走动中Db,手动调节等(在这种情况下,看到其他职位)

其他的一些事情:

随着PM控制台...
- 从列表中选择您的项目,
- 确保你的“主EXE”(调用数据项目/组件 - 或者说同一个项目中,如果主机/应用程序) - 设置为“启动”项目,
- 始终看控制台意见 - 因为它可能试图建立和访问不同的项目。

连接:

看到这个帖子我的迁移不会改变我的表
总之 - 您的连接被命名为喜欢你的背景+你的项目 - 如果不是另有说明。 它吸引了来自您的DBCONFIG构造 - 或app.config中(连接)。 请确保你在寻找“正确的数据库”(即你的样子通过一些探险家,什么样的代码,第一次连接到 - 可能是两个不同的东西)。

建造:
确保您的项目在“配置”自动构建设置 - 这可能是一个问题了。



文章来源: Code first create tables