【问题标题】:Is it possible to add CHECK constraint with fluent API in EF7?是否可以在 EF7 中使用 fluent API 添加 CHECK 约束?
【发布时间】:2015-12-12 21:55:19
【问题描述】:

是否可以在 Entity Framework 7 中使用 fluent API 添加 CHECK 约束?

我需要达到这样的目标:

...
ADD CONSTRAINT CK_SomeTable_SomeColumn CHECK (SomeColumn >= X);

如果解决方案是特定于提供商的,那也没关系 - 我只针对 MsSqlServer(至少现在是这样)。

【问题讨论】:

  • 这不是检查约束,但我使用以下内容仅强制执行祝福值:public sealed class ProfileStatus { public string Name { get; } public static readonly ProfileStatus Public = new ProfileStatus("Public"); public static readonly ProfileStatus Private = new ProfileStatus("Private"); public static readonly ProfileStatus VerifiedOnly = new ProfileStatus("VerifiedOnly"); private ProfileStatus(string name) { Name = name; } } 而且我无法正确获取格式,抱歉...

标签: entity-framework-core


【解决方案1】:

从 EF 7.0.0-rc1 开始,使用 fluent API 是不可能的。

您可以在迁移中手动定义约束

migrationBuilder.Sql("ALTER TABLE SomeTable ADD CONSTRAINT CK_SomeTable_SomeColumn CHECK (SomeColumn >= X);");

【讨论】:

    【解决方案2】:

    从 EF Core 3.0 开始,您可以使用

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SomeTable>(entity =>
            entity.HasCheckConstraint("CK_SomeTable_SomeColumn", "[SomeColumn] >= X");
    }
    

    【讨论】:

    • 以防万一有人想知道您需要安装Microsoft.EntityFrameworkCore.Relational NuGet 包才能使用此扩展方法。
    • 我安装了那个包但是我找不到正确的using路径...
    【解决方案3】:

    Lukas Kabrt 在 2019 年仍然有效,所以我必须创建一个特殊的迁移,我将包含约束及其删除:

            protected override void Up(MigrationBuilder migrationBuilder)
            {
                migrationBuilder.Sql(@"
    alter table AdminObjectReview add CONSTRAINT CK_AdminObjectReview_OnlyOneType CHECK 
    ( 
          (CASE WHEN AnswerId IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN QuestionId IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN CommentId IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN UserId IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN TagId IS NULL THEN 0 ELSE 1 END)
         = 1 )
    ");
            }
    
            protected override void Down(MigrationBuilder migrationBuilder)
            {
                migrationBuilder.Sql("alter table AdminObjectReview  drop CONSTRAINT CK_AdminObjectReview_OnlyOneType");
            }
    

    【讨论】:

    • 我看不出这会增加什么超出接受的答案已经解释的内容。你能说清楚一点吗?
    • 确实如此。通过建议扩展接受的答案,即可以/应该在迁移 Down 方法中删除约束。 +1 因为 -1 不公平
    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多