【问题标题】:Entity Framework Core, custom changes and preventing them from being overwrittenEntity Framework Core,自定义更改并防止它们被覆盖
【发布时间】:2020-10-24 05:13:38
【问题描述】:

我目前正在升级一个旧的 Web API 项目,并且我正在尝试将 EF Core(5.0 预览版)引入该项目,而不是使用旧的第三方库(另一次说来话长)。为了帮助实现这一目标,我一直在对数据库表进行逆向工程(使用 EF Core Power Tools)。

我的一些表具有可以映射到枚举的字段。我想知道是否有一种方法可以更改实体的数据类型(例如从字符串到枚举),这样如果我再次运行逆向工程选项,更改就不会被覆盖?

例如,我的表格实现看起来像(非常标准)...

[Table("MyTable")]
public partial class MyTable
{
   public string SomeProperty { get; set; }
}

如何将 SomeProperty 的数据类型从 string 更改为 SomePropertyEnum,但如果我使用 EF Core Power Tools 进行另一个“逆向工程师”,它不会被覆盖?我可以使用另一个部分类,还是必须在派生类中完成?

我相信我还需要在 DbContext 文件中进行调整以适应这种变化(值转换??)。如果是这样,我该如何处理它而不被覆盖?

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    最后我决定离开我的实体类并创建一个匹配的 DTO 类......然后使用AutoMapper 进行从字符串到枚举的转换。

    // EF Core generated table entity
    [Table("MyTable")]
    public partial class MyTable
    {
        public string SomeProperty { get; set; }
    }
    
    // DTO class to map to the table entity
    public class MyTableAsDTO
    {
        public MyEnum SomeProperty { get; set; }
    }
    

    ...然后使用 AutoMapper 进行转换:

    CreateMap<MyTable, MyTableAsDTO>()
       .AfterMap((src, dest) =>
       {
          if (Enum.TryParse(src.SomeProperty, out MyEnum myEnum)
              dest.SomeProperty = myEnum;
          else
              dest.SomeProperty = MyEnum.<defaultValue>;
       })
       .ReverseMap();
    

    不确定是否有更优雅的方法可以做到这一点,但目前可行。我可以运行 EF Core Power Tools 的“逆向工程”选项,刷新我的表实体,但不会丢失任何自定义数据类型更改。

    更新:正如 @LucianBargaoanu 在 cmets 中提到的,我实际上不需要手动进行 Enum 转换......这是 AutoMapper 内置的。所以我的映射看起来就像......

    CreateMap<MyTable, MyTableAsDTO>()
        .ReverseMap();
    

    【讨论】:

    • 这是一个内置的转换,但你是手动完成的。
    • @LucianBargaoanu,你是对的,它是一个内置的转换。我做了一些测试并证实了这一点。感谢您的提示。
    【解决方案2】:

    我认为您可以通过将 IScaffoldingModelFactory 服务替换为您自己的扩展 RelationalScaffoldingModelFactory 的服务来实现您想要的。

    那么我认为您可以覆盖 VisitColumn 或 GetTypeScaffoldingInfo 来操作每列的元数据。

    您还会在这个相关问题中找到其他一些想法; Entity Framework Core Customize Scaffolding

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2021-06-15
      • 2018-06-27
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多