Entity Framework 初始迁移因 SqlException 而失败
Entity Framework initial migration failed with SqlException
我想使用 EF 模型的代码优先方法创建 SQL 服务器 DB/tables。
这是我的简单模型 class
public class MyApplication
{
[Key]
public string AppID { get; set; }
public string AppName { get; set; }
}
我的 DBContext class 显示在这里
public class PolicyDBContext : DbContext
{
public PolicyDBContext(DbContextOptions options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder OptionaBuilder)
{
if (OptionaBuilder.IsConfigured)
{
OptionaBuilder.UseSqlServer(builder => builder.EnableRetryOnFailure());
}
}
DbSet<MyApplication> AppRoles { get; set; }
}
这是我在 Startup.cs
中的配置代码
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PolicyDBContext>(item => item.UseSqlServer("Server=MyServer;Database=MyDB;user id=testuid;Password=testpwd;");
}
然后我能够运行成功执行“add-migration initialmigration”命令
但是当我运行“更新数据库”命令时,它总是失败并出现以下错误
Error Number:64,State:0,Class:20
A transient exception occurred during execution. The operation will be retried after 15024ms.
Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
然而,在执行“更新数据库”之后,我注意到新数据库总是在我的 SQL 服务器上创建,但其中没有表。我认为这表明至少我的连接字符串是好的。
从上面的代码可以看出,我做了EnableRetryOnFailure,正如人们在回应类似我的问题时所建议的那样。但它并没有解决我的问题,只是它会在最终放弃之前重试几次 (6)。
我在这里错过了什么?
不确定为什么会这样,但我现在知道如何修复它。看来我需要 运行 update-database 命令两次。第一次会失败,但正如我在 post 中提到的那样,将创建新的空数据库。现在,将空数据库留在那里 - 不要删除它! - 再次 运行 更新数据库命令。这次它会成功并创建表。
代码优先选项中有两种方法。您应该使用 protected override void OnModelCreating(ModelBuilder modelBuilder)
{ }
您应该在此方法中定义配置。
有关详细信息,请访问此 link。
我想使用 EF 模型的代码优先方法创建 SQL 服务器 DB/tables。 这是我的简单模型 class
public class MyApplication
{
[Key]
public string AppID { get; set; }
public string AppName { get; set; }
}
我的 DBContext class 显示在这里
public class PolicyDBContext : DbContext
{
public PolicyDBContext(DbContextOptions options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder OptionaBuilder)
{
if (OptionaBuilder.IsConfigured)
{
OptionaBuilder.UseSqlServer(builder => builder.EnableRetryOnFailure());
}
}
DbSet<MyApplication> AppRoles { get; set; }
}
这是我在 Startup.cs
中的配置代码public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PolicyDBContext>(item => item.UseSqlServer("Server=MyServer;Database=MyDB;user id=testuid;Password=testpwd;");
}
然后我能够运行成功执行“add-migration initialmigration”命令
但是当我运行“更新数据库”命令时,它总是失败并出现以下错误
Error Number:64,State:0,Class:20
A transient exception occurred during execution. The operation will be retried after 15024ms.
Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
然而,在执行“更新数据库”之后,我注意到新数据库总是在我的 SQL 服务器上创建,但其中没有表。我认为这表明至少我的连接字符串是好的。
从上面的代码可以看出,我做了EnableRetryOnFailure,正如人们在回应类似我的问题时所建议的那样。但它并没有解决我的问题,只是它会在最终放弃之前重试几次 (6)。
我在这里错过了什么?
不确定为什么会这样,但我现在知道如何修复它。看来我需要 运行 update-database 命令两次。第一次会失败,但正如我在 post 中提到的那样,将创建新的空数据库。现在,将空数据库留在那里 - 不要删除它! - 再次 运行 更新数据库命令。这次它会成功并创建表。
代码优先选项中有两种方法。您应该使用 protected override void OnModelCreating(ModelBuilder modelBuilder) { } 您应该在此方法中定义配置。
有关详细信息,请访问此 link。