问题描述
我正在尝试使用 C# 和 EF Core 迁移在 Azure 突触中创建数据库,但遇到了一个问题,当我尝试运行 update-database 命令时出现以下错误:
不支持强制唯一约束。要创建非强制唯一约束,您必须在语句中包含 NOT ENFORCED 语法。
以下示例演示了 azure synapse 接受的使用 PRIMARY KEY 创建表的形式:
CREATE TABLE dbo.sample_table
(
c1 int IDENTITY(1,1) NOT NULL,c2 char(10) NULL,c3 datetime NULL
)
ALTER TABLE t1
ADD CONSTRAINT PK_t1_c1
PRIMARY KEY NONCLUSTERED (c1) NOT ENFORCED
这是因为要使用主键必须包括:
NONCLUSTERED (myPrimaryKey) NOT ENFORCED
要包含 NONCLUSTERED
,只需使用 configuração abaixo。
public class ManifestationMap : IEntityTypeConfiguration<Manifestation>
{
public void Configure(EntityTypeBuilder<Manifestation> builder)
{
builder.ToTable("Manifestation");
builder.HasKey(prop => prop.Id)
.IsClustered(false); // Include NONCLUSTERED
...
但我没有找到包含 NOT ENFORCED
的解决方案。
Obs:我在使用 Azure SQL Server 和使用本地安装的 SQL Server 时都没有这个问题。
解决方法
Synapse 使用与 Azure SQL 或 SQL Server 不同的数据库引擎,并且实体框架当前不支持它,因此您可能会遇到这样的兼容性问题。您可以在此处对功能请求进行投票:https://feedback.azure.com/forums/307516-azure-synapse-analytics/suggestions/12868725-support-for-entity-framework
与此同时,您最好的选择是在遇到此类问题时使用 custom SQL scripts,而不是依靠通过 MigrationBuilder.Sql()
自动生成的脚本来解决这些问题。