我们有一堆EF Migration类在我们的集成测试中执行。对于某些测试,我们使用反射找到迁移类:
var dbMigrationClasses = migrationsAssembly.GetTypes()
.Where(t => t.IsSubclassOf(typeof(DbMigration)));
然后我们在某些测试中使用.Name属性:
var migrationsWithInvalidClassNames = migrationClasses
.Where(mt => !IsValidMigrationClassName(mt.Name));
但是,自升级到VS 2015 RC以来,我们的许多课程都将其名称报告为“<> c”,而FullName也以此结尾:
Name = "<>c"
FullName = "DataMigrations.Migrations._20150121090200_DoSomeStuff+<>c"
这种情况从未发生过(我猜它是导致它的VS 2015s新编译器),它只发生在我们迁移类的一些(可能是四分之一)。所有类看起来都是相同的(所有内部,相同的方法/属性)。
我可以通过阅读FullName并将其剥离来解决这个问题,但我很想知道发生了什么以及为什么它只会影响某些类。这是两个示例类,一个是精细的,一个是<>c
。我删除的只是其中的SQL:
// File 1
namespace NewMind.DMS.DataMigrations.Migrations
{
[MigrationName("Drop the SavedSearchJSON column from the SavedSearch table.")]
internal class _20150121143400_DropTheSavedSearchJSONColumnFromTheSavedSearchTable : DmsMigration
{
public override void Up()
{
Sql(@"(SNIP)");
}
}
}
// File 2
namespace NewMind.DMS.DataMigrations.Migrations
{
[MigrationName("Update Facility Key data type as it was incorrectly smallint in some databases.")]
internal class _20150424130800_StandardiseFacilityKeyDataType : DmsMigration
{
public override void Up()
{
Sql(@"(SNIP)");
}
}
}
答案 0 :(得分:0)
您不需要使用FullName
- _20150121090200_DoSomeStuff
部分只是“父”类。 <>c
嵌套在_20150121090200_DoSomeStuff
中。因此,要获取嵌套类及其父级的名称,您只需执行此操作:
public static string GetAnonymousName(this Type type)
{
if (!type.IsNested) return type.Name;
return type.DeclaringType.GetAnonymousName() + "+" + type.Name;
}
我认为它在VS2015中没有改变。也许你正在使用更新版本的Entity Framework或类似的东西?
答案 1 :(得分:0)
好的,这是用户错误:
我实际上错过了代码中的一个重要行...我们以两种方式找到迁移类...基类和命名空间:
// Get all possible migration classes (use base class + namespace)
var dbMigrationClasses = migrationsAssembly.GetTypes().Where(t => t.IsSubclassOf(typeof(DbMigration)));
var migrationNamespaceClasses = migrationsAssembly.GetTypes().Where(t => t.Namespace != null && t.Namespace.EndsWith(".Migrations", StringComparison.OrdinalIgnoreCase));
// Join them together for tests to query
migrationClasses = dbMigrationClasses.Union(migrationNamespaceClasses);
这意味着除了实际的类之外,我们还从新的编译器中获取编译器生成的类。
为什么我没有看到文件有任何区别?我误读了类名,并选择了旁边的类似迁移。猜猜正确的是什么?...
AddColumn("SavedSearch", "SavedSearchXML", c => c.String(nullable: false, defaultValue: "", isMaxLength: true));
卫生署。