微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Update-Database 生成的脚本有语法错误,而正常的 Update-Database 工作正常

如何解决Update-Database 生成的脚本有语法错误,而正常的 Update-Database 工作正常

我有 .NET Framework 4.8 项目,使用 Entity Framework 6.2.0 进行了多次迁移。我的问题是,当我从本地计算机中删除我的数据库并成功运行 Update-Database Database create 时,但是当我运行 Update-Database -Script 命令并保存我的 sql 脚本然后使用

运行 sql 脚本时
Invoke-sqlcmd -InputFile ".\build\artifacts\migration.sql" -ServerInstance "(localdb)\MSsqlLocalDB"

我收到很多语法错误,例如

Invoke-sqlcmd : 'CREATE/ALTER PROCEDURE' 必须是查询中的第一条语句 批量。

在这种情况下不能使用带有返回值的 RETURN 语句。

我的问题是为什么会出现这些错误?以及如何解决?为什么正常的 update-database 可以正常工作,但 sql 脚本有语法错误

更新:我认为 Adding 'GO' statements to Entity Framework migrations 进行一些修改可以解决我的问题

解决方法

正如我们所知,正如您所见SQL Server - Must be first statement in query batch - what and why?

来自http://msdn.microsoft.com/en-us/library/ms175502(v=sql.105).aspx

批处理使用规则

以下规则适用于使用批处理:

  • 创建默认值、创建函数、创建过程、创建规则、创建 SCHEMA、CREATE TRIGGER 和 CREATE VIEW 语句不能组合使用 与批处理中的其他语句。 CREATE 语句必须开始 批。该批次中的所有其他语句将是 解释为第一个 CREATE 语句定义的一部分。
  • 不能更改表,然后在表中引用的新列 同一批。
  • 如果 EXECUTE 语句是批处理中的第一条语句, EXECUTE 关键字不是必需的。 EXECUTE 关键字是必需的 如果 EXECUTE 语句不是批处理中的第一个语句。

问题是当我们生成脚本而不是直接使用 csv_file = 'train.csv' csv_data = pd.read_csv(csv_file,low_memory = False) csv_df = pd.DataFrame(csv_data) CONTI_FEATURES = ['Age','Smoking'] CATE_FEATURES = ['Gender','ICD9Code'] def print_transformation(feature,continuous,size): feature_names = [feature] d = dict(zip(feature_names,[csv_data[feature]])) if continuous == True: c = tf.feature_column.numeric_column(feature) feature_columns = [c] else: c = tf.feature_column.categorical_column_with_hash_bucket(feature,hash_bucket_size=size) c_indicator = tf.feature_column.indicator_column(c) feature_columns = [c_indicator] ## Use input_layer to print the value input_layer = tf.feature_column.input_layer( features=d,feature_columns=feature_columns ) return input_layer Age_feature = print_transformation(feature = "Age",continuous = True,size = 2) Smoking_feature = print_transformation(feature = "Smoking",size = 2) Gender_feature = print_transformation(feature = "Gender",continuous = False,size = 2) Diagnosis_feature = print_transformation(feature = "ICD9Code",size = 1000) continuous_features = [Age_feature,Smoking_feature] categorical_features = [Gender_feature,Diagnosis_feature] model = tf.estimator.LinearClassifier( n_classes = 2,model_dir = "ongoing/train",feature_columns = categorical_features + continuous_features ) 时,所有迁移都希望在批处理中运行,并且当我们在迁移中存在一些违反 SQL 规则的手工 SQL 脚本时会导致一些错误。

所以为了解决这个问题,我们必须在语句的开头添加 Update-Database。 (感谢Ivan Stus

感谢 Larnu 帮助我调查问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。