如何解决Update-Database 生成的脚本有语法错误,而正常的 Update-Database 工作正常
我有 .NET Framework 4.8 项目,使用 Entity Framework 6.2.0 进行了多次迁移。我的问题是,当我从本地计算机中删除我的数据库并成功运行 Update-Database
Database create 时,但是当我运行 Update-Database -Script
命令并保存我的 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 举报,一经查实,本站将立刻删除。