/
MigrationAssembly.cs
76 lines (62 loc) · 2.53 KB
/
MigrationAssembly.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.Migrations.Infrastructure
{
using System.Collections.Generic;
using System.Data.Entity.Migrations.Utilities;
using System.Data.Entity.Resources;
using System.Data.Entity.Utilities;
using System.Linq;
using System.Reflection;
internal class MigrationAssembly
{
public static string CreateMigrationId(string migrationName)
{
DebugCheck.NotEmpty(migrationName);
return (UtcNowGenerator.UtcNowAsMigrationIdTimestamp() + "_" + migrationName);
}
public static string CreateBootstrapMigrationId()
{
return new string('0', 15) + "_" + Strings.BootstrapMigration;
}
private readonly IList<IMigrationMetadata> _migrations;
protected MigrationAssembly()
{
}
public MigrationAssembly(Assembly migrationsAssembly, string migrationsNamespace)
{
DebugCheck.NotNull(migrationsAssembly);
_migrations
= (from t in migrationsAssembly.GetAccessibleTypes()
where t.IsSubclassOf(typeof(DbMigration))
&& typeof(IMigrationMetadata).IsAssignableFrom(t)
&& t.GetPublicConstructor() != null
&& !t.IsAbstract()
&& !t.IsGenericType()
&& t.Namespace == migrationsNamespace
select (IMigrationMetadata)Activator.CreateInstance(t))
.Where(mm => !string.IsNullOrWhiteSpace(mm.Id) && mm.Id.IsValidMigrationId())
.OrderBy(mm => mm.Id)
.ToList();
}
public virtual IEnumerable<string> MigrationIds
{
get { return _migrations.Select(t => t.Id).ToList(); }
}
public virtual string UniquifyName(string migrationName)
{
return _migrations.Select(m => m.GetType().Name).Uniquify(migrationName);
}
public virtual DbMigration GetMigration(string migrationId)
{
DebugCheck.NotEmpty(migrationId);
var migration
= (DbMigration)_migrations
.SingleOrDefault(m => m.Id.StartsWith(migrationId, StringComparison.Ordinal));
if (migration != null)
{
migration.Reset();
}
return migration;
}
}
}