2013-03-17 54 views
2

我有使用DbMigrator,不知何故遷移類不執行,當然在數據庫中沒有反映的問題執行遷移。實體框架 - DbMigrator不執行遷移類

我試圖實現是一羣我遷移到版本。基本上我有一個版本基類,其中所有版本都是從中派生的。

例如我有一個類Version1000其對應於1.0.0.0版本。

版本類有一個名爲ExecuteMigrations方法負責執行與它對應的版本遷移。

下面是一個版本類(Version1000 for 1.0.0.0)的示例,請參閱使用DbMigrator的ExecuteMigrations方法,它也使用從DbMigrationsConfiguration派生的VersionConfiguration類,它在那裏設置名稱空間,目錄,在ContextType。等等。

public class Version1000 : Version 
{ 
    public override string VersionNumber 
    { 
     get { return "1.0.0.0"; } 
    } 

    public static Version Version 
    { 
     get 
     { 
      return new Version1000(); 
     } 
    } 

    public override void ExecuteMigrations() 
    { 
     var configuration = new VersionConfiguration(); 
     configuration.TargetDatabase = new DbConnectionInfo(MyCustomContext.CONTEXT_CONNECTION_STRING_NAME); 
     var migrator = new DbMigrator(configuration); 
     migrator.Update(); 
    } 
} 

VersionConfiguration類

class VersionConfiguration : DbMigrationsConfiguration<MyCustomContext> 
{ 
    public VersionConfiguration() 
    { 
     AutomaticMigrationsEnabled = false; 
     MigrationsNamespace = "Some.Namespace._1000"; 
     MigrationsDirectory = "Migration\\1000"; 
     ContextType = typeof(MyCustomContext); 
    } 

    protected override void Seed(MyCustomContext context) 
    { 
     base.Seed(context); 
    } 
} 

在我的應用程序的應用開始我做的是檢查我的數據庫的當前版本,然後適用的是無版本t應用於當前數據庫。這是通過調用版本類的ExecuteMigrations方法來完成的。

事情是我沒有得到任何異常,只是當調用DbMigrator.Update方法時,這些更改沒有反映到數據庫中,並且DbMigrationsConfiguration中設置的文件夾/命名空間中的遷移類從未執行。

應用類型:ASP.NET MVC 4 .NET框架:4.5

回答

1

你的移民也應該實現IVersionMetadata,並且必須提供一個ID,源和目標特性。他們應該有相似的價值觀:

Id = string.Format("{0}_{1}", SomeSequenceNumber.ToString().PadLeft(15, '0'), "Name") 
Source = null 
Target = "H4sIAAAAAAAEAL1Y23LbNhB970z/gYOn9iGCJEdJ66GSsWW78bSyO6aT1wxErmRMcGEJ0BX7a33oJ/UXuryKF11o2e6bCKx2z1lwD47079//uB/XUjiPEBmu1ZSMBkPigPJ1wNVqSmK7fPMT+fjh++/cy0CunS9l3Ekah99UZkoerA1PKTX+A0hmBpL7kTZ6aQe+lpQFmo6Hw5/paEQBUxDM5TjuXawsl5A94ONMKx9CGzMx1wEIU6zjjpdldW6YBBMyH6Zknpzzv4hzJjjD4h6IJXHCt6efDXg20mrlhcxyJu6TEHB/yYSBAupp+LYv2uE4RUuZUtpiOq2OYksqHsjkEhnbBJlaxhVEGaUpORdMfUsXYW3r4dUXPLBF6CdurI4S4uQbKcGc/6DYudN/Yiven14bLzEW5JTYKN6Qf98L/GhMR8OMvOSrKONuiEPrTGiLSpdliq2JOsf2bhe2d8djazbtV0i2lGnEYNTvkQ4hsskdLAuY8zLhdbAVJz2cojhFRNAjg0sxrrlSZtyGqDhsG+FYEmfO1r+BWtmHKRlPJsS54msIypXijf+sOE4xlNVvYiHYQkC1fxhhC0+d3k44k9H4f4KTCUWJ5Jwrlk5GDQl+3I7k+aXxMYh9W4jhnm6cvE4zygFM626UkuZSWUoq3aGp7pyFIQKtaWyx4ni5wM7eeE9XO5nnoL7ZJ3pVJZQEtoLWbvqOBXDFI2MvmGULlvZiFshOWB/RLEu1tPP1JaghgiWK9HOOJK89SAkO8rhBNemmVPLBftVs1dsc4RV2VYKyWYOh6sUhFe7kyy5eJli0T5NmWsRSHSefu0vUZaZe4UnqupdDLhwN9PnSs9K2RaGev73Xq5BLW4fafsto5zVr3TDtWdh3h7dDquqVnrR0wy1m+LBh6wx1HkIcbMsjD9KBrg+F94eYCY58NwFzpvgSjL3X3wDNZzqFLQN4hDmjxgSih0PralIvm5aN2l6nlrdhSoKFxjskvwC+fq0m6XUl66Uc3WQXtsmLOrpOmac6ui7Opzq6QxmOcnTqkUX+A4u6nq5rCg4COGjYtlbLLNvzqzX8GNZZZJbsB8nWP75E+u2eayuhkyP49LNUXclzaf2XrHsBhq8285P+rlXgp0e+SVrGXKulLkmietTBlCHtFoNlAYrQWWT5kvkWt30wJnOdX5iIMeRSLiC4VrexDWN7ZgzIhUjqVF26v37mG5uY3dswm8uXoIAwOVKAW3UecxFUuK/yU6I9UqR6/AvgejZK6Lox3SqpMt1o1TNR0b4LCEEFeN/cgwwFJjO3ymOPsBvb4R42O+ZecIaTL02RY/P99I8Vmv6z8uE/KRLfnIsRAAA="; 

也許對目標參數一些澄清:它包含了整個模型的壓縮版本。他們想要刪除在EF中給出目標的必要性,但是,即使EF6 alpha3仍然需要這樣做。上面給出的字符串是一個空模型的壓縮格式,我只是把作爲一個常數,它就像一個魅力...

另外:在我的項目,我有錯編號格式,它沒有這樣做任何東西。需要儘快在EF源中瞭解更多信息,但是,現在也許這可以幫助您的案例!

-1

嗯,你的代碼看起來很奇怪。實體類或對它們的引用在哪裏?什麼實體/數據庫對象包含在1.0.0.0版本中?

由於代碼一說,你必須描述你的實體:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

namespace StartReg.Data {   
    public class UserSession { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int UserSessionId { get; set; } 

     [Required] 
     [MaxLength(100)] 
     public string UserId { get; set; } 

     [ForeignKey("UserId")] 
     public virtual User User { get; set; } 

     [Required] 
     public DateTimeOffset LogonTime { get; set; } 

     [Required] 
     [MaxLength(40)] 
     public string LogonIPAddress { get; set; } 

     [Required] 
     [MaxLength()] 
     public string LogonUserAgent { get; set; } 
    }  
} 

將它添加到的DbContext:

namespace StartReg.Data { 
    using System; 
    using System.Collections.Generic; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 
    using System.Linq; 

    public partial class StartRegDb : DbContext { 
     public StartRegDb() 
      : base("DefaultConnection") { 
     } 

     public DbSet<Distance> Distances { get; set; } 
    } 
} 

而當你再在軟件包管理控制檯(執行已安裝的NuGet做?)命令Enable-MigrationsAdd-Miration Version1000您將收到遷移配置

namespace StartReg.Migrations { 
    using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Migrations; 
    using System.Linq; 
    using StartReg.Data; 

    internal sealed class Configuration : DbMigrationsConfiguration<StartReg.Data.StartRegDb> { 
     public Configuration() { 
      AutomaticMigrationsEnabled = false; 
     } 

     protected override void Seed(StartReg.Data.StartRegDb context) { 
      // This method will be called after migrating to the latest version. 
     } 
    } 
} 

和Version1000遷移類別:

命名空間StartReg.Migrations { using System;使用System.Data.Entity的 。遷移;

public partial class Initial : DbMigration { 
    public override void Up() { 

     CreateTable(
      "dbo.Distances", 
      c => new { 
       DistanceId = c.Guid(nullable: false), 
       MeetingId = c.Int(nullable: false), 
       Key = c.String(nullable: false, maxLength: 20), 
       Name = c.String(nullable: false, maxLength: 100), 
       Ordering = c.Short(nullable: false), 
       AllowMale = c.Boolean(nullable: false), 
       AllowFemale = c.Boolean(nullable: false), 
      }) 
      .PrimaryKey(t => t.DistanceId) 
      .ForeignKey("dbo.Meetings", t => t.MeetingId, cascadeDelete: true) 
      .Index(t => t.MeetingId) 
      .Index(t => new { MeetingId = t.MeetingId, Ordering = t.Ordering }); 
    } 

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

}

之後,你需要的地方在什麼地方與數據庫中的任何實際工作(的Application_Start爲例):

Database.SetInitializer(new MigrateDatabaseToLatestVersion<StartRegDb, StartReg.Migrations.Configuration>()); 

和App啓動時 - 中自動創建表的距離數據庫。

+0

我有從DbMigration派生遷移類和是有在那裏語句創建表就像在你的榜樣。如果您試圖查看自定義DBMigrationsConfiguration(VersionConfiguration),它將在其中設置遷移類的名稱空間及其所在的文件夾,但不知何故它不會執行它們。 – mdcuesta 2013-03-18 07:40:55