【问题标题】:Add modifications to your model when using EF Core DB First Design使用 EF Core DB First Design 时向模型添加修改
【发布时间】:2019-05-03 14:51:12
【问题描述】:

我的团队使用 Db 优先设计。 我们创建数据库,然后使用 Scaffold-DbContext 命令创建模型。

问题是当我们需要修改模型然后重新创建时。

public partial class UserInfo
{
    public int Id { get; set; }
    [Required]
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public DateTime RecordCreated { get; set; }
}

在使用 -Force 调用 Scaffold-DbContext 时,它将从中删除 [Required]。

我应该考虑使用 ViewModel、创建部分类还是什么?

很早就使用 EF core 2.1,因此我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我知道它是首先创建数据库的,但是在初始创建模型之后,如果您在更改数据库之前进行模型更改,最好从代码创建迁移,这样对模型的所有更改都将复制到数据库中.

    【讨论】:

    • 有时(经常)会有其他程序员更改数据库。我可能别无选择,只能使用 Scaffold-DbContext -Force。我需要知道如何做到这一点。几个地方证实这是正确的工作流程而不是切换到迁移。我被告知要使用部分类,目前正在尝试让它发挥作用。
    • 那么是的,部分类是要走的路或模型继承,其中基本模型将在一个地方,而继承的模型相同,但具有属性,并且全部位于另一个文件夹中,因此脚手架不会压扁它。您还可以使用从模型的持久存储库到视图模型的映射。这是一个很好的链接,可以帮助您入门c-sharpcorner.com/article/…
    【解决方案2】:

    使用 EF Core Power Tools,它会为 OnModelCreating 生成一个分部方法,然后在新的分部类中使用 fluent API 来设置Required 选项而不是属性。

    【讨论】:

    • 或者只是在部分类文件中实现你的OnModelCreating,重新搭建数据库后,手动删除脚手架生成的OnModelCreating方法。
    • 显然我需要做更多的阅读,我几乎但不完全关注你们两个。我得到了 EF Core Power Tools,但是你在如何使用 fluent API 上迷失了方向。而且我不明白如何按照大卫所说的去做。
    【解决方案3】:

    正如 ErikEJ 指出的那样,这是行不通的:

    您可以将元数据类与部分类一起使用(例如 复制自doc):

    using System;
    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    using System.Globalization;
    
    [MetadataType(typeof(UserInfoMetaData))]
    public partial class UserInfo
    {
    
    }
    
    public class UserInfoMetaData
    {
        [Required()]
        public object FirstName;
    }
    

    这将放在一个单独的文件中,不会被 代码生成。请注意,您不需要将所有属性添加到 元数据类及其类型无关紧要 - 但名称必须 匹配。

    有一些方法可以使其工作,请参阅this SO item,它本身基于此ASP.NET Forums question。在 ASP.net 链接中,还有一个建议是在视图模型而不是数据类上进行验证。所以这可能是一个考虑的可能性。

    【讨论】:

    • @ErikEJ 不幸的是我还没有使用 EF Core;但我扩大了答案。谢谢
    【解决方案4】:

    如果您首先使用数据库,则将数据库列设为必需(NOT NULL),然后再次运行脚手架,而不是相反。脚手架时,您可以选择通过 fluent 配置生成属性,如果这样做,您将获得添加的“必需”属性(用于引用类型)。

    Scaffold-Dbontext 的开关是-DataAnnotations

    https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell#scaffold-dbcontext

    【讨论】:

    • 谢谢...这非常有趣,我以前从未见过 -DataAnnotations 标志。我会在今天几个小时后读到。感谢更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多