Entity Framework context.database.create() 仍然通过我的 Class : DbMigration
Entity Framework context.database.create() still goes through my Class : DbMigration
美好的一天!我想要一些关于为什么我的 context.Database.Create() 仍然通过我的 类 的想法:DbMigration。如果我不删除我的数据库,迁移工作正常。但是如果我删除我的数据库并开始一个新的。它将遍历我的迁移列表并尝试更新,并将 return 关于 dbo 的错误。"tablename" 未找到。
这是代码
public class DMSDbContextInitializer : DMSDbContextInitializerBase, IDatabaseInitializer<DMSDbContext>
{
public void InitializeDatabase(DMSDbContext context)
{
var dbname = context.Database.Connection.Database;
if (context.Database.Exists())
{
var migrator = new DbMigrator(new MigrationConfiguration
{
AutomaticMigrationsEnabled = false
});
//Get all pending migrations
var pendingmigrations = migrator.GetPendingMigrations().Select(x => new
{
numericid = Convert.ToInt64(x.Split(new[] { '_' })[0]),
migrationid = x
}).ToList();
//Get last migration entry
var latestMigrationHistory = context.GetMigrationHistories().OrderByDescending(x => x.MigrationId).FirstOrDefault();
if (latestMigrationHistory != null)
{
var latestmigrationid = Convert.ToInt64(latestMigrationHistory.MigrationId.Split(new[] { '_' })[0]);
var prevmigrations = pendingmigrations.Where(x => x.numericid < latestmigrationid);
//exclude all prev migration in update and insert a fake history table record for each
foreach (var prevmigration in prevmigrations)
{
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
@"INSERT INTO __MigrationHistory (MigrationId,ContextKey,Model, ProductVersion) VALUES (@p0,@p1,@p2,@p3)",
prevmigration.migrationid,
migrator.Configuration.ContextKey,
latestMigrationHistory.Model,
latestMigrationHistory.ProductVersion
);
}
}
//Execute all valid pending migrations
if (migrator.GetPendingMigrations().Any())
migrator.Update();
/*Some seed and update codes*/
context.SaveChanges();
}
else
{
//Create db
context.Database.Create();
ConfigureFileTableSupport(context, dbname);
ConfigureImageFileTableSupport(context, dbname);
//Initial Data
Seed(context);
}
在我的 context.Database.Create() 中,如果我按 F11,它将通过我的 Class : DbMigration。我似乎找不到问题所在。
这里是 DbContext
public class DMSDbContext : BaseDbContext, IDMSDbContext
{
public DMSDbContext()
: base("DMSCtx")
{
}
public DMSDbContext(string connectionstring)
: base(connectionstring)
{
}
public IDbSet<FileMetadata> FileMetadata { get; set; }
public IDbSet<FileMetadataContent> FileMetadataContents { get; set; }
public IDbSet<SharedFile> SharedFiles { get; set; }
public IDbSet<AuditFileMetadata> AuditFileMetadata { get; set; }
public ITransactionScope CreateTransactionScope()
{
return new EfTransactionScope(Database.BeginTransaction());
}
public IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters)
{
return Database.SqlQuery<T>(sql, parameters);
}
public int ExecuteSqlCommand(string sql, params object[] parameters)
{
return Database.ExecuteSqlCommand(sql, parameters);
}
public string DatabaseName
{
get { return Database.Connection.Database; }
}
/// <summary>
/// Query the Migration History Table
/// </summary>
/// <returns></returns>
public IList<MigrationHistory> GetMigrationHistories()
{
return Database.SqlQuery<MigrationHistory>("select * from __migrationhistory").ToList();
}
}
public interface IDMSDbContext
{
IDbSet<FileMetadata> FileMetadata { get; set; }
IDbSet<FileMetadataContent> FileMetadataContents { get; set; }
IDbSet<SharedFile> SharedFiles { get; set; }
IDbSet<AuditFileMetadata> AuditFileMetadata { get; set; }
int SaveChanges();
DbContextConfiguration Configuration { get; }
ITransactionScope CreateTransactionScope();
IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters);
int ExecuteSqlCommand(string sql, params object[] parameters);
string DatabaseName { get; }
}
我不确定您为什么要自己实施 "exact"/接近 EF 迁移工作方式的功能?
你的 CreateDatabaseIfNotExists Db 初始化策略之后是什么?
还是只是我没好好读你的问题?
public class SchoolDBContext: DbContext
{
public SchoolDBContext(): base("SchoolDBConnectionString")
{
Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>());
//Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>());
//Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseAlways<SchoolDBContext>());
//Database.SetInitializer<SchoolDBContext>(new SchoolDBInitializer());
}
public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; }
}
阅读更多:Ef Db initialization strategies
有关迁移的更多信息:Ef Code First Migrations
美好的一天!我想要一些关于为什么我的 context.Database.Create() 仍然通过我的 类 的想法:DbMigration。如果我不删除我的数据库,迁移工作正常。但是如果我删除我的数据库并开始一个新的。它将遍历我的迁移列表并尝试更新,并将 return 关于 dbo 的错误。"tablename" 未找到。
这是代码
public class DMSDbContextInitializer : DMSDbContextInitializerBase, IDatabaseInitializer<DMSDbContext>
{
public void InitializeDatabase(DMSDbContext context)
{
var dbname = context.Database.Connection.Database;
if (context.Database.Exists())
{
var migrator = new DbMigrator(new MigrationConfiguration
{
AutomaticMigrationsEnabled = false
});
//Get all pending migrations
var pendingmigrations = migrator.GetPendingMigrations().Select(x => new
{
numericid = Convert.ToInt64(x.Split(new[] { '_' })[0]),
migrationid = x
}).ToList();
//Get last migration entry
var latestMigrationHistory = context.GetMigrationHistories().OrderByDescending(x => x.MigrationId).FirstOrDefault();
if (latestMigrationHistory != null)
{
var latestmigrationid = Convert.ToInt64(latestMigrationHistory.MigrationId.Split(new[] { '_' })[0]);
var prevmigrations = pendingmigrations.Where(x => x.numericid < latestmigrationid);
//exclude all prev migration in update and insert a fake history table record for each
foreach (var prevmigration in prevmigrations)
{
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
@"INSERT INTO __MigrationHistory (MigrationId,ContextKey,Model, ProductVersion) VALUES (@p0,@p1,@p2,@p3)",
prevmigration.migrationid,
migrator.Configuration.ContextKey,
latestMigrationHistory.Model,
latestMigrationHistory.ProductVersion
);
}
}
//Execute all valid pending migrations
if (migrator.GetPendingMigrations().Any())
migrator.Update();
/*Some seed and update codes*/
context.SaveChanges();
}
else
{
//Create db
context.Database.Create();
ConfigureFileTableSupport(context, dbname);
ConfigureImageFileTableSupport(context, dbname);
//Initial Data
Seed(context);
}
在我的 context.Database.Create() 中,如果我按 F11,它将通过我的 Class : DbMigration。我似乎找不到问题所在。
这里是 DbContext
public class DMSDbContext : BaseDbContext, IDMSDbContext
{
public DMSDbContext()
: base("DMSCtx")
{
}
public DMSDbContext(string connectionstring)
: base(connectionstring)
{
}
public IDbSet<FileMetadata> FileMetadata { get; set; }
public IDbSet<FileMetadataContent> FileMetadataContents { get; set; }
public IDbSet<SharedFile> SharedFiles { get; set; }
public IDbSet<AuditFileMetadata> AuditFileMetadata { get; set; }
public ITransactionScope CreateTransactionScope()
{
return new EfTransactionScope(Database.BeginTransaction());
}
public IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters)
{
return Database.SqlQuery<T>(sql, parameters);
}
public int ExecuteSqlCommand(string sql, params object[] parameters)
{
return Database.ExecuteSqlCommand(sql, parameters);
}
public string DatabaseName
{
get { return Database.Connection.Database; }
}
/// <summary>
/// Query the Migration History Table
/// </summary>
/// <returns></returns>
public IList<MigrationHistory> GetMigrationHistories()
{
return Database.SqlQuery<MigrationHistory>("select * from __migrationhistory").ToList();
}
}
public interface IDMSDbContext
{
IDbSet<FileMetadata> FileMetadata { get; set; }
IDbSet<FileMetadataContent> FileMetadataContents { get; set; }
IDbSet<SharedFile> SharedFiles { get; set; }
IDbSet<AuditFileMetadata> AuditFileMetadata { get; set; }
int SaveChanges();
DbContextConfiguration Configuration { get; }
ITransactionScope CreateTransactionScope();
IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters);
int ExecuteSqlCommand(string sql, params object[] parameters);
string DatabaseName { get; }
}
我不确定您为什么要自己实施 "exact"/接近 EF 迁移工作方式的功能?
你的 CreateDatabaseIfNotExists Db 初始化策略之后是什么? 还是只是我没好好读你的问题?
public class SchoolDBContext: DbContext
{
public SchoolDBContext(): base("SchoolDBConnectionString")
{
Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>());
//Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>());
//Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseAlways<SchoolDBContext>());
//Database.SetInitializer<SchoolDBContext>(new SchoolDBInitializer());
}
public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; }
}
阅读更多:Ef Db initialization strategies 有关迁移的更多信息:Ef Code First Migrations