3

我跟着this教程,我試圖在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" }); 
    } 
    } 
} 

在Filters文件夾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"); 
    } 
    } 
} 
+2

你好,你運行'Add-Migrations' [命令](http://msdn.microsoft.com/en-us/data/jj591621.aspx)腳手架更改,然後再運行'Update-Database' ? – nkvu

+0

嗨,是啊,我試過,順便說一句,忘了提到這一點。但它沒有奏效。 – Yustme

回答

14

我只是在這裏拋開一切的步行通過讓你的代碼優先和遷移去- 攻擊可能發生或可能不發生的各種問題。注意:代碼優先被證明是非常可靠的 - 並且可以通過實時方案解決 - 你只需要知道你在做什麼。

很可能,您的遷移和數據庫基本上是不同步的。

您現有的遷移嘗試針對數據庫的舊副本運行 - 我估計已針對「空數據庫」優化了ups/downs。

您需要針對您附加的Db副本運行您的遷移(添加遷移) - 這將創建一個「差異」並剛剛達到您的Db(始終確保確保當然可以備份,因爲它可能會丟失/更改等)。

或者如果可能的話,清空你的Db - 然後重新開始。

或者如果您的Db創建遷移並在您的開發機器上運行Update-Database -Script以生成完整的Db或更改(這一切都非常粗糙,您需要根據自己的情況進行調整)。然後通過運行腳本應用到你的'活Db'。

您還可以檢查我的早期文章的同步...

MVC3 and Code First Migrations - "model backing the 'blah' context has changed since the database was created"

編輯:
還要檢查這個答案AutomaticMigrationsEnabled false or true?

而如果它是確定你做事的方式添加AutomaticMigrationsEnabled = true;Configuration(還根據遷移文件夾 - 爲您創建)..

我總是這樣做幾個步驟來清理遷移:

(良好的備份第一)
- 啓用 - 遷移-force(第一次只 - 這將刪除configuration.cs任何「seed'-ING那裏!)
- AutomaticMigrationsEnabled = TRUE;
- 在這一點上重建項目
- - 加 - 遷移初始
- 更新,數據庫-Force -Verbose

...以後(從項目(\遷移)
手工刪除現有的遷移後續遷移):
- 添加遷移SomeOther1
- 更新,數據庫-Force -Verbose
...提供你保持你的數據庫同步 - 即小心'走動中Db,手動調節等。(和該案例見另一篇文章)

幾個其他的事情:

隨着PM控制檯...
- 從列表中選擇您的項目,
- 確保你的「主EXE」(調用數據項目/組件 - 或相同項目如果控制檯/應用程序) - 設置爲'啓動'項目,
- 總是觀看控制檯評論 - 因爲它可能試圖構建和訪問不同的項目。

連接:

看到這個職位礦Migration does not alter my table
在短期的 - 你的連接被命名爲喜歡你的背景+你的項目 - 如果不是另有說明。它從您的DbConfig構造函數 - 或app.config(連接)中繪製。確保你正在查看'正確的數據庫'(即你通過某個瀏覽器查看的內容以及代碼優先連接的內容)可能是兩個不同的事情。

大廈:
確保您的項目在「配置」自動構建設置 - 這可能是一個問題了。

+0

因此,當我運行add-migrations,然後自動從控制檯執行update-database命令時,代碼首先不會爲我執行此操作?我寧願使用代碼,而不願意使用腳本。 – Yustme

+0

是的,它是爲你做的 - 但你'錯過了一步'沿線 - 因爲它由於某種原因顯然不同步。腳本僅用於「活動服務器」更新,而不用於測試/ dev等。只需再次從「添加遷移」開始 - 看看會發生什麼 - 如果您在本地計算機上。遷移爲你做了很多事情 - 但是當把'東西移動到不同的機器'時往往會失敗 - '舊的Db'也必須通過遷移來完成 - 所以它可以'繼續'應用遷移。如果不是這樣的話。 – NSGaga

+0

你是'生活'還是'本地'?如果是本地的,你可以嘗試刪除(備份第一個)數據庫,它應該爲你重新創建它(因爲這顯然是對你的測試,這是最簡單的)。因此,步驟是 - 刪除Db,刪除「所有遷移文件」(在Migrations文件夾下的所有##### ... cs文件) - 重建項目 - 然後「添加遷移」 - 然後更新數據庫-verbose - 並檢查遷移CS和腳本生成 - 你可以發佈 - 這是很容易解決,除非遠程 – NSGaga