Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# Entity Framework context.database.create()仍在我的类中:DbMigration_C#_Entity Framework_Ef Code First_Entity Framework Migrations - Fatal编程技术网

C# Entity Framework context.database.create()仍在我的类中:DbMigration

C# Entity Framework context.database.create()仍在我的类中:DbMigration,c#,entity-framework,ef-code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Entity Framework Migrations,你好!我想了解一下为什么context.Database.Create()仍然在我的类中使用:DbMigration。如果我不删除我的数据库,迁移工作正常。但是如果我放弃我的数据库并开始一个新的。它将遍历我的迁移列表并尝试更新,并将返回一个关于dbo的错误。“tablename”未找到 这是密码 public class DMSDbContextInitializer : DMSDbContextInitializerBase, IDatabaseInitializer<DMSDb

你好!我想了解一下为什么context.Database.Create()仍然在我的类中使用:DbMigration。如果我不删除我的数据库,迁移工作正常。但是如果我放弃我的数据库并开始一个新的。它将遍历我的迁移列表并尝试更新,并将返回一个关于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);
        }
公共类DMSDbContextInitializer:DMSDbContextInitializerBase,IDatabaseInitializer
{
public void InitializeDatabase(DMSDbContext上下文)
{
var dbname=context.Database.Connection.Database;
if(context.Database.Exists())
{
var migrator=新的DbMigrator(新的MigrationConfiguration
{
AutomaticMiggerationsEnabled=错误
});
//获取所有挂起的迁移
var pendingmigrations=migrator.GetPendingMigrations()。选择(x=>new
{
numericid=Convert.ToInt64(x.Split(new[]{'.})[0]),
迁移ID=x
}).ToList();
//获取上次迁移条目
var latestMigrationHistory=context.GetMigrationHistories().OrderByDescending(x=>x.MigrationId).FirstOrDefault();
如果(latestMigrationHistory!=null)
{
var latestmigrationid=Convert.ToInt64(latestMigrationHistory.MigrationId.Split(new[]{'.})[0]);
var previmigrations=pendingmigrations.Where(x=>x.numericid
在我的context.Database.Create()中,如果我按F11,它将遍历我的类: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; }
}
公共类DMSDbContext:BaseDbContext,IDMSDbContext { 公共DMSDbContext() :base(“DMSCtx”) { } 公共DMSDbContext(字符串连接字符串) :基本(连接字符串) { } 公共IDbSet文件元数据{get;set;} 公共IDbSet FileMetadataContents{get;set;} 公共IDbSet共享文件{get;set;} 公共IDbSet AuditFileMetadata{get;set;} 公共ITransactionScope CreateTransactionScope() { 返回新的EfTransactionScope(Database.BeginTransaction()); } 公共IEnumerable SqlQuery(字符串sql,参数对象[]参数) { 返回Database.SqlQuery(sql,参数); } public int ExecuteSqlCommand(字符串sql,参数对象[]参数) { 返回Database.ExecuteSqlCommand(sql,参数); } 公共字符串数据库名 { 获取{return Database.Connection.Database;} } /// ///查询迁移历史记录表 /// /// 公共IList GetMigrationHistories() { return Database.SqlQuery(“select*from _migrationhistory”).ToList(); } } 公共接口IDMSDbContext { IDbSet FileMetadata{get;set;} IDbSet FileMetadataContents{get;set;} IDbSet SharedFiles{get;set;} IDbSet AuditFileMetadata{get;set;} int SaveChanges(); DbContextConfiguration配置{get;} ITransactionScope CreateTransactionScope(); IEnumerable SqlQuery(字符串sql,参数对象[]参数); int EXECUTESQLCOMAND(字符串sql,参数对象[]参数); 字符串数据库名{get;} }
我不知道您为什么要实现“精确的”/接近EF迁移工作原理的功能

在CreateDatabaseIfNotExists数据库初始化策略之后,您所做的不是吗? 还是只是我没有把你的问题读得足够好

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; }
}
公共类SchoolDBContext:DbContext
{   
public SchoolDBContext():base(“SchoolDBConnectionString”)
{
SetInitializer(新的CreateDatabaseIfNotExists());
//SetInitializer(新的DropCreateDatabaseIfModelChanges());
//SetInitializer(新的DropCreateDatabaseAlways());
//SetInitializer(new SchoolDBInitializer());
}
公共数据库集学生{get;set;}
公共数据库集标准{get;set;}
}
阅读更多:
关于迁移的更多信息:

我不知道您为什么要实现“精确的”/“接近EF迁移工作原理”的功能

在CreateDatabaseIfNotExists数据库初始化策略之后,您所做的不是吗? 还是只是我没有把你的问题读得足够好

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; }
}
公共类SchoolDBContext:DbContext
{   
public SchoolDBContext():base(“SchoolDBConnectionString”)
{
SetInitializer(新的CreateDatabaseIfNotExists());
//SetInitializer(新的DropCreateDatabaseIfModelChanges());
//SetInitializer(新的DropCreateDatabaseAlways());
//Database.SetInitializer(