实体框架- DbMigrator不执行迁移类
本文关键字:执行 迁移 DbMigrator 框架 实体 | 更新日期: 2023-09-27 18:04:15
我有一个使用DbMigrator执行迁移的问题,不知怎的,迁移类没有执行,当然也没有反映在数据库中。
我想实现的是将我的迁移分组到版本。基本上,我有一个版本基类,其中所有版本都派生自。
例如,我有一个类Version1000对应于1.0.0.0版本。
版本类有一个叫做executemigration的方法,它负责执行与它对应的版本相关的迁移。
这里是一个版本类的示例(Version1000 for 1.0.0.0),请参阅使用DbMigrator的executemigration方法,它还使用了派生自DbMigrationsConfiguration的VersionConfiguration类,它在那里我设置了名称空间,目录,上下文类型…等
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);
}
}
在应用程序启动时,我所做的是检查数据库的当前版本,然后应用未应用于当前数据库的版本。这是通过调用版本类的executemigration方法来完成的。
事情是我没有得到任何异常,它只是,变化没有反映到数据库时,DbMigrator。在DbMigrationsConfiguration中设置的文件夹/命名空间中的迁移类从未执行过。
应用程序类型:ASP。Net MVC 4.NET Framework: 4.5
您的迁移还应该实现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.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-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迁移类:
StartReg名称空间。迁移{使用系统;使用System.Data.Entity.Migrations;
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>());
当应用程序启动时,表距离会自动在数据库中创建。