唯一约束允许空值。

16 浏览
0 Comments

唯一约束允许空值。

在模型中是否可能拥有一个允许多个空值的唯一属性?

实施方案是使用SQL Server,看起来这是可能的:SQL Server UNIQUE约束条件允许重复的NULL值

是否有办法修改CFE中唯一约束的行为?

谢谢您的回答。

0
0 Comments

唯一约束允许为空值的问题出现的原因是SQL Server生产者无法生成特定的SQL语句。然而,您可以通过一个过滤索引来替换生成的索引。

如果您需要更改一个或两个索引,您可以创建一个名为after_<default namespace>_tables.sql的SQL脚本。此脚本将由SQL生产者自动执行。

-- TODO Drop unique index if exists
CREATE UNIQUE INDEX [IX_Cus_Cuo_Cus] ON [dbo].[Customer]([Customer_FullName])
WHERE [Customer_FullName] IS NOT NULL

如果您需要更改很多索引,您可以编写一个模板并使用SQL Server模板生产者。

[%@ namespace name="CodeFluent.Model"%]
[%@ namespace name="CodeFluent.Model.Persistence"%]
/* [%=Producer.GetSignature()%] */
[%foreach(Table table in Producer.Project.Database.Tables) { if (table.Constraints.Count == 0) continue;%]
[%foreach(CodeFluent.Model.Persistence.Constraint constraint in table.Constraints) { if (constraint.ConstraintType != ConstraintType.Unique) continue; %]
-- TODO Drop unique index if exists    
CREATE UNIQUE INDEX [[%=constraint.ShortName%]] ON [[%=CodeFluent.Producers.SqlServer.SqlServerProducer.GetOwner(table)%]].[%=table.FullName%] (
[%for(int i = 0; i < constraint.Columns.Count; i++) {%]
[%if(i != 0){%], [%}%][[%=constraint.Columns[i].Name%]]
[%}%]
)
WHERE [%for(int i = 0; i < constraint.Columns.Count; i++) {%]
[%if(i != 0){%]AND [%}%][[%=constraint.Columns[i].Name%]] IS NOT NULL
[%}%] 
[%}%]
[%}%]

0