C# 如何使用数据库优先的方法在EF Core中添加数据验证?

C# 如何使用数据库优先的方法在EF Core中添加数据验证?,c#,entity-framework,validation,entity-framework-core,ef-database-first,C#,Entity Framework,Validation,Entity Framework Core,Ef Database First,我正在用ASP.NET核心(RC2)和ORM实体框架核心实现一个MVC Web应用程序。因为我已经有了数据库设计,所以我必须通过Scaffold DBContext命令创建实体模型 这个很好用。现在,我想向生成的实体添加一些注释,以便添加验证。例如,最大长度: public class Blog { public int BlogId { get; set; } [MaxLength(500)] public string Url { get; set; } } 如果有

我正在用ASP.NET核心(RC2)和ORM实体框架核心实现一个MVC Web应用程序。因为我已经有了数据库设计,所以我必须通过Scaffold DBContext命令创建实体模型

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

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

如果有一些数据库更改,我必须再次使用scaffold命令。但这会导致一些附加注释的丢失。如何更新实体模型而不丢失它们?根据page或从中可以看出,使用EF6似乎是可能的。EF7/Core是否有类似的方法来实现这一点?

是的,您可以。您必须使用
流畅的API
而不是
数据注释

下面是您使用
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);
        }
    }
公共部分类MyContext:DbContext { 公共数据库集博客{get;set;} 模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder) { modelBuilder.Entity() .Property(b=>b.Url) .HasMaxLength(500); } }
OP的反馈意见

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

我的建议:

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

OP的反馈:

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

我的建议:


您不需要删除任何重复的映射。B'cos EF优先于
Fluent API
。代码自动再生所做的映射并不重要。您可以使用
Fluent-API
覆盖那些。这就是
Fluent-API
的功能。您还可以同时使用
DataAnnotation
Fluent-API
。但是代码优先于
Fluent-API>数据注释>默认约定

在EF-Core中没有“数据库优先”的方法。scaffold命令旨在让您首先从现有数据库开始编写代码。此后,您应该使用迁移从对模型的更改中更新数据库架构。EF Core还可以基于现有数据库创建模型。这就是我所说的“”方法。您的意思是,我应该只在迁移过程中对数据库所做的每一次更改中使用该命令一次吗?例如:“添加迁移UpdateTableUser”和“更新数据库”是的,这就是我的意思。谢谢你的回答。但也将生成数据库上下文类。这意味着,如果我再次使用该命令,它将替换旧的数据库上下文。当然,有一些方法可以防止替换它。。。我只是希望
数据注释也有可能
没错,我可以用
部分
类解决它,但是在生成实体之后,您必须遍历所有实体并删除所有重复的属性。仍然不是我想要的,因为您仍然需要修改实体。看来你不必这么做,谢谢你的邀请。嗯,我仍然面临着矛盾的性质。也就是说,当我创建一个分部类
Blog
(上面的示例)并添加一些自定义注释时,我总是得到一个带有模糊引用的VS错误,因为该属性已经存在另一个注释。如果我为
DBContext
使用一个parial类并使用
Fluent-API
定义属性,也会发生这种情况。您有推荐的代码示例吗?为什么需要创建重复的注释?嗨,Sampath,我在您的回答中尝试了这种方法,但是没有任何运气能够验证fluent api。我的模型是使用scaffold命令生成的,用于required/max-length验证的fluent API条目都在EF-core生成的上下文类的onModelCreating方法中。我有一个ASP.NET核心控制器,它以JSON的形式获取模型类的数据,但是ModelState.IsValid始终返回true,即使我发送了无效数据。你能给我举个例子吗?我看到的与验证相关的都使用了数据注释。