如何解决 SQL 在代码优先迁移部署 Azure 期间找不到数据类型 BLOB

Tim*_*çek 2 c# sql azure asp.net-core

我想将当前在 ASP.NET Core 上使用的 sqlite 数据库与 Azure SQL 交换。我生成了资源,sql server 项目中定义的所有内容。

当我想将应用程序发布到云中的azure和sql数据库的部署服务器时,它说Cannot find data type BLOB。我在互联网上检查了解决方案,但没有工作。我想我必须更新我的模型,但我不知道以什么方式?

首先我在这里useSqlLiteServer改为UseSqlServer

  services.AddDbContext<DataContext>(x => x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
Run Code Online (Sandbox Code Playgroud)

我还应该对下面列出的模型进行哪些更改,下面列出了我的一个模型,其他模型也类似

namespace HospitalAppointmentAPI.Models
{
    public class Patient
    {   
        public int Id { get; set; }
        public string IdentityNumber { get; set; }
        public string Name { get; set; } 
        public byte[] PasswordHash { get; set; }
        public byte[] PasswordSalt { get; set; }
        public DateTime BirthDate { get; set; }
        public string Email { get; set; }
        public ICollection<Appointment> Appointments { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

数据上下文.cs

 public class DataContext : DbContext
    {
        public DataContext(DbContextOptions<DataContext> options) : base(options) {}
        public DbSet<Hospital> Hospitals { get; set; }
        public DbSet<Department> Departments { get; set; }
        public DbSet<Doctor> Doctors { get; set; }
        public DbSet<Patient> Patients { get; set; }
        public DbSet<Appointment> Appointments { get; set; }

    }
Run Code Online (Sandbox Code Playgroud)

EF 迁移脚本生成期间的完整错误消息

C:\Program Files\dotnet\sdk\3.0.100\Sdks\Microsoft.NET.Sdk.Publish\targets\PublishTargets\Microsoft.NET.Sdk.Publish.MSDeploy.targets(140,5):错误:Web 部署任务失败的。(执行数据库脚本期间发生错误。错误发生在脚本的以下行之间:“23”和“39”。详细日志可能包含有关该错误的更多信息。该命令以以下内容开头:“IF NOT EXISTS(SELECT * FROM [__EFMigrationsHisto" 列、参数或变量 #4:找不到数据类型 BLOB。http: //go.microsoft.com/fwlink/?LinkId =178587 了解更多信息: http://go。 microsoft.com/fwlink/?LinkId=221672#ERROR_SQL_EXECUTION_FAILURE。)无法发布数据库。如果远程数据库无法运行脚本,则可能会发生这种情况。请尝试修改数据库脚本,或在打包/发布 Web 属性页中禁用数据库发布。如果由于数据库表已存在而导致脚本失败,请尝试在创建新数据库对象之前删除现有数据库对象。有关从 Visual Studio 执行这些选项的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=179181 . 错误详细信息: 执行数据库脚本期间发生错误。错误发生在脚本的以下行之间:“23”和“39”。详细日志可能包含有关错误的更多信息。该命令以以下内容开头:“IF NOT EXISTS(SELECT * FROM [__EFMigrationsHisto”列、参数或变量 #4:找不到数据类型 BLOB。http: //go.microsoft.com/fwlink/?LinkId =178587 了解更多信息,请访问: http://go.microsoft.com/fwlink/? LinkId=221672#ERROR_SQL_EXECUTION_FAILURE。列、参数或变量#4:找不到数据类型 BLOB。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常) , 布尔中断连接, 动作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1wrappCloseInAction)在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet批量CopyHandler、TdsParserStateObject stateObj、布尔值& dataReady)在System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串methodName,布尔异步,Int32超时,布尔asyncWrite)在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1完成,字符串methodName,布尔sendToPipe,Int32超时, Microsoft.Web.Deployment.DBStatementInfo.Execute(DbConnection 连接、DbTransaction 事务、DeploymentBaseContext baseContext、Int32 timeout) 处 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 处的 Boolean&usedCache、Boolean asyncWrite、Boolean inRetry) 发布部署失败。

Jac*_*Jia 5

在Sqlite中,类型BLOB用于存储字节数组。在 SQL Server 中,byte[]支持类型。

就您而言,您首先使用 Sqlite,然后更改为使用 SQL Server。因此,您需要删除迁移脚本历史记录。

在此输入图像描述

然后创建并应用 SQl Server 数据库的初始迁移:

dotnet ef migrations add init -o Data\Migrations
dotnet ef database update
Run Code Online (Sandbox Code Playgroud)

然后表将在您的 SQL Server 数据库中创建。您的应用程序将准备好运行。