Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-DbMigrator未执行迁移类_C#_Asp.net_.net_Entity Framework_Entity Framework 5 - Fatal编程技术网

C# 实体框架-DbMigrator未执行迁移类

C# 实体框架-DbMigrator未执行迁移类,c#,asp.net,.net,entity-framework,entity-framework-5,C#,Asp.net,.net,Entity Framework,Entity Framework 5,我在使用DbMigrator执行迁移时遇到了一个问题,不知为什么迁移类没有执行,当然也没有反映在数据库中 我试图实现的是将迁移分组到版本。基本上我有一个版本基类,其中所有版本都是从中派生的 例如,我有一个对应于版本1.0.0.0的类Version1000 版本类有一个名为ExecuteMigrations的方法,该方法负责执行与其对应的版本相关的迁移 这里是一个版本类的示例(1.0.0.0版本为Version1000),请参阅使用DbMigrator的ExecuteMigrations方法,它还

我在使用DbMigrator执行迁移时遇到了一个问题,不知为什么迁移类没有执行,当然也没有反映在数据库中

我试图实现的是将迁移分组到版本。基本上我有一个版本基类,其中所有版本都是从中派生的

例如,我有一个对应于版本1.0.0.0的类Version1000

版本类有一个名为ExecuteMigrations的方法,该方法负责执行与其对应的版本相关的迁移

这里是一个版本类的示例(1.0.0.0版本为Version1000),请参阅使用DbMigrator的ExecuteMigrations方法,它还使用一个从DBMigrationConfiguration派生的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();
    }
}
版本配置类

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);
    }
}
类版本配置:dbmigrationconfiguration
{
公共版本配置()
{
AutomaticMiggerationsEnabled=假;
migrationNamespace=“Some.Namespace.\u 1000”;
MigrationsDirectory=“Migration\\1000”;
ContextType=typeof(MyCustomContext);
}
受保护的覆盖无效种子(MyCustomContext上下文)
{
种子(上下文);
}
}
在应用程序启动时,我要做的是检查数据库的当前版本,然后应用未应用于当前数据库的版本。这是通过调用version类的ExecuteMigrations方法来完成的

问题是我没有得到任何异常,只是在调用DbMigrator.Update方法时,更改没有反映到数据库中,并且在dbmigrations配置中设置的文件夹/命名空间中的迁移类从未执行过

应用程序类型:ASP.NET MVC 4
.NET Framework:4.5

嗯,您的代码看起来很奇怪。实体类或它们的引用在哪里?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; }
    }
}
和版本1000迁移类:

命名空间StartReg.Migrations{ 使用制度; 使用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");
    }
}
}

在这之后,您需要在数据库的任何实际工作之前放置一个位置(例如,应用程序启动):

Database.SetInitializer(新的MigrateDatabaseToLatestVersion());

当应用程序启动时,会在数据库中自动创建表距离。

您的迁移还应实现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也需要这样做。上面给出的字符串是一个空模型的压缩格式,我只是把它作为一个常量,它就像一个符咒


另外:在我的项目中,我有错误的Id格式,它没有做任何事情。需要尽快在EF源代码中了解更多信息,但是,现在也许这有助于您的案例

我确实有从DbMigration派生的迁移类,是的,其中有一些语句创建表,就像您的示例中一样。如果您试图查看自定义DBMigrationsConfiguration(VersionConfiguration),它会设置在迁移类的名称空间和它所在的文件夹中,但不知何故它不会执行它们。
Database.SetInitializer(new MigrateDatabaseToLatestVersion<StartRegDb, StartReg.Migrations.Configuration>());
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=";