C# DbMigrator.Update生成一个数据库';名称';已经存在

C# DbMigrator.Update生成一个数据库';名称';已经存在,c#,.net,entity-framework,C#,.net,Entity Framework,我首先对web api系统使用EF代码,但在我的上下文配置中使用DbMigrator会导致SqlException: ystem.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: Database 'name' already exists. Choose a different database name.. 代码如下所示: public Configuration() { Automat

我首先对web api系统使用EF代码,但在我的上下文配置中使用DbMigrator会导致SqlException:

ystem.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: Database 'name' already exists. Choose a different database name..
代码如下所示:

public Configuration()
    {
        AutomaticMigrationsEnabled = true;

        var dbMigrator = new DbMigrator(this);

        // This is required to detect changes.
        var pendingMigrationsExist = dbMigrator.GetPendingMigrations().Any();

        if (pendingMigrationsExist)
        {
            dbMigrator.Update();
        }
    }
如果不调用
dbMigrator.Update()
,则不会执行seed方法

如何使seed方法在没有此问题的情况下运行?
删除
dbMigrator.Update()
调用允许系统创建数据库,但不添加任何数据种子

注: 我使用的是CreateDatabaseIfNotExists初始化器,这是使用上下文的构造函数设置的:

public MyContext() : base("name=myconnectionstringname")
{
    Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
}
public MyContext():base(“name=myconnectionstringname”)
{
SetInitializer(新的CreateDatabaseIfNotExists());
}
编辑:添加有关上下文的信息:

public class TelephonyContext : DbContext
{
    private const string Key = "ddd412345fdee012ddd41e3456789012";
    private const string Iv = "fab41e34567fk012";

    public TelephonyContext()
        : base("name=telephony-connection")
    {
        var encryptedPassword = ConfigurationManager.AppSettings["telephony-pass"];
        var password = AesEncryption.Decrypt(encryptedPassword, Key, Iv);

        Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXXX", password);

        Database.SetInitializer(new CreateDatabaseIfNotExists<TelephonyContext>());
    }

    public virtual DbSet<SoftphoneUser> SoftphoneUserSet { get; set; }

    public virtual DbSet<InitialCall> InitialCallSet { get; set; }

    public virtual DbSet<CallAudit> CallAuditSet { get; set; }

    public virtual DbSet<RecordingErrorType> RecordingErrorTypeSet { get; set; }

    public virtual DbSet<SourceApplication> SourceApplicationSet { get; set; }

    public override int SaveChanges()
    {
        foreach (var history in ChangeTracker.Entries()
                    .Where(e => e.Entity is IModificationHistory && (e.State == EntityState.Added ||
                        e.State == EntityState.Modified))
           .Select(e => e.Entity as IModificationHistory))
        {
            history.DateModified = DateTime.Now;
            if (history.DateCreated == DateTime.MinValue)
            {
                history.DateCreated = DateTime.Now;
            }
        }

        var result = base.SaveChanges();
        foreach (var history in ChangeTracker.Entries()
                                      .Where(e => e.Entity is IModificationHistory)
                                      .Select(e => e.Entity as IModificationHistory))
        {
            history.IsDirty = false;
        }

        return result;
    }

    // todo need to sort this issue
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling", Justification = "TODO need to sort this issue")]
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (modelBuilder != null)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            modelBuilder.Configurations.Add(new SoftphoneUserConfiguration());
            modelBuilder.Configurations.Add(new InitialCallConfiguration());
            modelBuilder.Configurations.Add(new CallAuditConfiguration());

            modelBuilder.Configurations.Add(new SourceApplicationConfiguration());
            modelBuilder.Configurations.Add(new RecordingErrorTypeConfiguration());

            base.OnModelCreating(modelBuilder);
        }
    }
}
公共类电话上下文:DbContext
{
private const string Key=“ddd412345fdee012ddd41e3456789012”;
私有常量字符串Iv=“fab41e34567fk012”;
公共电话上下文()
:base(“名称=电话连接”)
{
var encryptedPassword=ConfigurationManager.AppSettings[“电话通行证”];
var password=AesEncryption.Decrypt(encryptedPassword,Key,Iv);
Database.Connection.ConnectionString=Database.Connection.ConnectionString.Replace(“XXXXXX”,密码);
SetInitializer(新的CreateDatabaseIfNotExists());
}
公共虚拟数据库集SoftphoneUserSet{get;set;}
公共虚拟DbSet InitialCallSet{get;set;}
公共虚拟数据库集CallAuditSet{get;set;}
公共虚拟数据库集RecordingErrorTypeSet{get;set;}
公共虚拟数据库集{get;set;}
公共覆盖int SaveChanges()
{
foreach(ChangeTracker.Entries()中的var历史记录)
其中(e=>e.Entity是IModificationHistory&&(e.State==EntityState.Added||
e、 State==EntityState.Modified)
.选择(e=>e.实体作为IModificationHistory))
{
history.DateModified=DateTime.Now;
if(history.DateCreated==DateTime.MinValue)
{
history.DateCreated=DateTime.Now;
}
}
var result=base.SaveChanges();
foreach(ChangeTracker.Entries()中的var历史记录)
.其中(e=>e.实体为修改历史)
.选择(e=>e.实体作为IModificationHistory))
{
history.IsDirty=false;
}
返回结果;
}
//todo需要对这个问题进行排序
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.维修性”,“CA1506:AvoidExcessiveClassCoupping”,justionment=“TODO需要对该问题进行排序”)]
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
if(modelBuilder!=null)
{
modelBuilder.Conventions.Remove();
添加(新的SoftphoneUserConfiguration());
添加(新的InitialCallConfiguration());
添加(新的CallAuditConfiguration());
添加(新的SourceApplicationConfiguration());
modelBuilder.Configurations.Add(新记录ErrorTypeConfiguration());
基于模型创建(modelBuilder);
}
}
}
和种子方法:

protected override void Seed(TelephonyContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        Console.WriteLine("running in method Configuration.Seed()");

        var allRecordingErrorTypes = new List<RecordingErrorType>();

        foreach (RecordingErrorTypeEnumeration errorType in Enum.GetValues(typeof(RecordingErrorTypeEnumeration)))
        {
            allRecordingErrorTypes.Add(new RecordingErrorType
            {
                ErrorTypeId = errorType,
                Name = Enum.GetName(typeof(RecordingErrorTypeEnumeration), errorType),
                Description = errorType.GetDescription()
            });
        }

        context.RecordingErrorTypeSet.AddOrUpdate(allRecordingErrorTypes.ToArray());

        var a = new SourceApplication { ApplicationId = 1, ApplicationName = "TelephonyService", IsActive = true, UpdatedBy = "System" };
        var b = new SourceApplication { ApplicationId = 2, ApplicationName = "MortgagePayments", IsActive = true, UpdatedBy = "System" };
        var c = new SourceApplication { ApplicationId = 3, ApplicationName = "HomeInsurancePayments", IsActive = true, UpdatedBy = "System" };
        var d = new SourceApplication { ApplicationId = 4, ApplicationName = "CreditCardPayments", IsActive = true, UpdatedBy = "System" };

        context.SourceApplicationSet.AddOrUpdate(app =>
            new { app.ApplicationId, app.ApplicationName, app.IsActive, app.UpdatedBy }, a, b, c, d);
    }
受保护的覆盖无效种子(TelephonyContext上下文)
{
if(上下文==null)
{
抛出新ArgumentNullException(nameof(context));
}
WriteLine(“running in method Configuration.Seed()”;
var allRecordingErrorTypes=新列表();
foreach(RecordingErrorTypeEnumeration Enumm.GetValues中的errorType(typeof(RecordingErrorTypeEnumeration)))
{
AllRecordingErrorType.Add(新的RecordingErrorType
{
ErrorTypeId=errorType,
Name=Enum.GetName(typeof(RecordingErrorTypeEnumeration),errorType),
Description=errorType.GetDescription()
});
}
context.RecordingErrorTypeSet.AddOrUpdate(allRecordingErrorTypes.ToArray());
var a=newsourceapplication{ApplicationId=1,ApplicationName=“TelephonyService”,IsActive=true,UpdatedBy=“System”};
var b=newsourceapplication{ApplicationId=2,ApplicationName=“MortgagePayments”,IsActive=true,UpdatedBy=“System”};
var c=newsourceapplication{ApplicationId=3,ApplicationName=“HomeInsurancePayments”,IsActive=true,UpdatedBy=“System”};
var d=newsourceapplication{ApplicationId=4,ApplicationName=“CreditCardPayments”,IsActive=true,UpdatedBy=“System”};
context.sourceapplicationstart.AddOrUpdate(应用=>
新的{app.ApplicationId,app.ApplicationName,app.IsActive,app.UpdatedBy},a,b,c,d);
}

我无法复制错误。这是我的密码:

public class MyContext: DbContext{
    public MyContext()
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
    }

    public DbSet<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int rating { get; set; }
}

internal sealed class Configuration : DbMigrationsConfiguration<MockApplicationUser.MyContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;

        var dbMigrator = new DbMigrator(this);

        // This is required to detect changes.
        var pendingMigrationsExist = dbMigrator.GetPendingMigrations().Any();

        if (pendingMigrationsExist)
        {
            dbMigrator.Update();
        }
    }

    protected override void Seed(MockApplicationUser.MyContext context)
    {
        Product[] products = new Product[] { new Product { Name = "Product1", rating = 1 }, new Product { Name = "Product1", rating = 1 }, new Product { Name = "Product1", rating = 1 } };
        context.Products.AddOrUpdate(products);
    }
}
公共类MyContext:DbContext{
公共MyContext()
{
SetInitializer(新的CreateDatabaseIfNotExists());
}
公共数据库集产品{get;set;}
}
公共类产品
{
public int ProductId{get;set;}
公共字符串名称{get;set;}
公共整数评级{get;set;}
}
内部密封类配置:DBMigOptionsConfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=真;
var dbMigrator=新的dbMigrator(此);
//这是检测更改所必需的。
var PendingMigrationExist=dbMigrator.GetPendingMigrations().Any();
如果(PendingMigrationExist)
{
dbMigrator.Update();
}
}
受保护的覆盖无效种子(MockApplicationUser.MyContext上下文)
{
产品[]产品=新产品[]{新产品{Name=“Product1”,评级=1},新产品{Name=“Product1”,评级=1},新产品{Name=“Produ