2013-03-17 3 views
2

У меня проблема с выполнением миграции с использованием DbMigrator, так как классы миграции не выполняются и, конечно, не отражают в базе данных.Entity Framework - DbMigrator не выполняет классы миграции

То, что я пытаюсь реализовать, - это групповые миграции в версии. В основном у меня есть базовый класс версии, в котором все версии получены.

Например, у меня есть класс Version1000, который соответствует версии 1.0.0.0.

В классах версий есть метод, называемый ExecuteMigrations, который отвечает за выполнение миграций, связанных с версией, которой он соответствует.

Вот пример класса версии (Version1000 for 1.0.0.0), см. Метод ExecuteMigrations с использованием DbMigrator, он также использует класс VersionConfiguration, который происходит из DbMigrationsConfiguration, он находится там, где я устанавливаю пространства имен, каталог, 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 Framework: 4,5

ответ

1

Ваша миграция также должна реализовывать IVersionMetadata и должна обеспечивать свойство Id, Source и Target. Они должны иметь значение, аналогичное:

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="; 

Может быть, некоторые пояснения о параметре Target: она содержит сжатую версию всей модели. Они хотят удалить необходимость в создании цели в EF, однако даже EF6 alpha3 все еще требует этого. Строка, приведенная выше, является сжатым форматом пустой модели, я просто ставил ее как константу и работает как шарм ...

Также: В моем проекте у меня был неправильный формат Id, и он не делал что-нибудь. Нужно больше узнать об этом в источнике 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; } 
    } 
} 

И когда вы затем выполнить в Package Manager Console (вы установили NuGet ?) Enable-Migrations и Add-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:

namespace 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>()); 

И когда запускается приложение - таблица расстояний автоматически создается база данных.

+0

У меня есть классы миграции, которые происходят из DbMigration и да, там есть инструкции, которые создают таблицы так же, как в вашем примере. Если вы попытались просмотреть пользовательскую конфигурацию DBMigrationsConfiguration (VersionConfiguration), в ней будет указано пространство имен классов миграции и папка, в которой оно расположено, но каким-то образом его не выполняется. – mdcuesta

Смежные вопросы