【问题标题】:How to add Data Validation in EF Core with Database First approach?如何使用 Database First 方法在 EF Core 中添加数据验证?
【发布时间】:2017-01-14 05:52:18
【问题描述】:

我正在使用 ASP.NET Core (RC2) 和 ORM 实体框架核心来实现 MVC-Web 应用程序。由于我已经有了数据库设计,我必须通过 Scaffold-DBContext 命令创建实体模型。

这很好用。现在,我想为生成的实体添加一些注释以添加验证。例如最大长度:

public class Blog
{
    public int BlogId { get; set; }
    [MaxLength(500)]
    public string Url { get; set; }
}

如果有一些数据库更改,我必须再次使用脚手架命令。但这会导致一些附加注释的丢失。如何在不丢失实体模型的情况下更新它们?根据asp.net 页面或来自此topic,EF6 似乎是可能的。是否有类似的方法可以使用 EF7/Core 实现这一目标?

【问题讨论】:

  • EF Core 中没有“数据库优先”的方法。脚手架命令旨在让您首先从现有数据库中开始使用代码。此后,您应该使用迁移来根据模型的更改更新数据库架构。
  • EF Core 还可以基于现有数据库创建模型。这就是我所说的“ldatabase first”方法。你的意思是,我应该只使用一次该命令,并且每次对数据库进行迁移更改?例如:“Add-Migration UpdateTableUser”,然后是“Update-Database”
  • 是的,我就是这个意思。

标签: c# entity-framework validation entity-framework-core ef-database-first


【解决方案1】:

是的,你可以。你必须使用Fluent API 而不是Data Annotations

这是您使用 Fluent API 的示例

public  partial class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>()
                .Property(b => b.Url)
                .HasMaxLength(500);
        }
    }

OP 的反馈

但也会生成数据库上下文类。这意味着,如果 我再次使用该命令,它将替换旧的数据库上下文。

我的建议:

您可以在此处使用partial 类。将您的自定义实现保留在该文件上。当您重新生成代码时,这些自定义代码不会被覆盖。

OP 的反馈:

我可以在生成部分类后解决它 实体,您必须遍历所有实体并删除所有 重复的属性。仍然不完全是我正在寻找的, 因为您仍然需要修改实体。

我的建议:

您无需删除任何重复的映射。 B'cos EF 优先于Fluent API。代码自动重新生成映射所做的任何事情都无关紧要。你可以覆盖那些使用Fluent API。这就是Fluent API的力量。你也可以同时使用DataAnnotationFluent API。但 code-First 优先于 Fluent API &gt; data annotations &gt; default conventions

【讨论】:

  • 感谢您的回答。但也会生成数据库上下文类。这意味着,如果我再次使用该命令,它将替换旧的数据库上下文。当然,有办法防止被替换……我只是希望Data annotations也有可能@
  • 没错,我可以用partial 类解决它,但是在生成实体之后,你必须遍历所有实体并删除所有重复的属性。仍然不是我正在寻找的,因为您仍然需要修改实体。看来您不必在 EF 6 (see section "Add metadata classes") 中执行此操作
  • 感谢您的提问。好吧,我仍然面临着模棱两可的属性。意味着,当我创建一个部分类Blog(上面的示例)并添加一些自定义注释时,我总是会收到一个带有模糊引用的 VS 错误,因为该属性已经存在另一个注释。如果我为DBContext 使用parial 类并使用Fluent API 定义属性,也会发生这种情况。你有推荐的代码示例吗?
  • 为什么需要创建重复的注解?
  • 您好 Sampath,我正在尝试您的答案中的方法,但没有任何运气获得验证以使用 fluent api。我的模型是使用脚手架命令生成的,所需/最大长度验证的流畅 API 条目都在 EF 核心生成的上下文类的 onModelCreating 方法中。我有一个 ASP.NET 核心控制器,它以 JSON 格式获取模型类的数据,但即使我发送无效数据,ModelState.IsValid 也始终返回 true。有什么例子可以指点我吗?我见过的与验证相关的都是使用数据注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多