实体框架核心 - 防止唯一索引上的多个空值

时间:2018-01-09 21:51:04

标签: c# entity-framework entity-framework-core unique-constraint

关于这个问题:Does EF Core allow a unique column to contain multiple nulls?

我希望每个值都是唯一的,甚至是null。

config.Entity<Product>()
    .HasIndex(b => b.ProductId)
    .IsUnique();

SQL中的等效项

[ProductId] int null unique foreign key references Product([Id])

我可以修改此代码以防止列上出现多个空值吗?

1 个答案:

答案 0 :(得分:9)

默认情况下,EF Core的Fluent API会添加

namespace detail {
    template<class> class type {};
    template<template<class...> class Temp, class...Ts>
    void try_deduce(type<Temp<Ts...>>);
}

template <template <class...> class, class, class = void>
struct IsSpecialization : std::false_type {};

template <template <typename...> class Temp, class Specialization>
struct IsSpecialization<Temp, Specialization, 
                        decltype(detail::try_deduce<Temp>(detail::type<Specialization>()))>
    : std::true_type {};

static_assert(IsSpecialization<SequenceExpr, SequenceExpr<int>>()());
static_assert(IsSpecialization<Expr, SequenceExpr<int>>()());
static_assert(!IsSpecialization<MergeExpr, SequenceExpr<int>>()());
static_assert(!IsSpecialization<SequenceExpr, MergeExpr<int>>()());

到迁移中创建的索引。

为了确保偶数NULL是唯一的,我们必须修改索引,如下所示:

filter: "[ProductId] IS NOT NULL"

这将删除过滤器,并允许NULL是唯一的。