Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心,自定义更改并防止它们被覆盖_C#_Entity Framework Core - Fatal编程技术网

C# 实体框架核心,自定义更改并防止它们被覆盖

C# 实体框架核心,自定义更改并防止它们被覆盖,c#,entity-framework-core,C#,Entity Framework Core,我目前正在升级一个旧的Web API项目,我正在尝试将EF Core(5.0预览版)引入到该项目中,而不是使用旧的第三方库(这是另一个很长的故事)。为了帮助实现这一点,我一直在对数据库表进行反向工程(使用EF Core Power Tools) 我的一些表具有可以映射到枚举的字段。我想知道的是,是否有一种方法可以更改实体的数据类型(例如,从字符串更改为枚举),以便在再次运行反向工程选项时,不会覆盖更改 例如,我的表实现看起来像(相当标准) 如何将SomeProperty的数据类型从string更

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

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

例如,我的表实现看起来像(相当标准)

如何将
SomeProperty
的数据类型从
string
更改为
SomePropertyEnum
,但如果我使用EF Core电动工具进行另一次“反向工程”,如何不覆盖它?我可以使用另一个分部类,还是必须在派生类中使用


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

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

// EF Core generated table entity
[Table("MyTable")]
public partial class MyTable
{
    public string 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();
CreateMap()
.AfterMap((src,dest)=>
{
if(Enum.TryParse(src.SomeProperty,out MyEnum MyEnum)
dest.SomeProperty=myEnum;
其他的
dest.SomeProperty=MyEnum。;
})
.ReverseMap();
我不确定是否有更优雅的方法来实现这一点,但这目前还可以。我可以运行EF Core Power Tools的“反向工程”选项,刷新我的表实体,但不会丢失任何自定义数据类型更改

更新:正如@LucianBargaoanu在评论中提到的,我实际上不需要手动进行枚举转换…这是内置到AutoMapper的。因此我的映射看起来就像

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

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

然后,我认为您可以重写VisitColumn或GetTypeScaffoldingInfo来操作每个列的元数据


您还可以在这个相关问题中找到其他一些想法;

这是一个内置转换,但您是手工完成的。@LucianBargaoanu,您是对的,这是一个内置转换。我做了一些测试并确认了这一点。谢谢您的提示。
CreateMap<MyTable, MyTableAsDTO>()
   .AfterMap((src, dest) =>
   {
      if (Enum.TryParse(src.SomeProperty, out MyEnum myEnum)
          dest.SomeProperty = myEnum;
      else
          dest.SomeProperty = MyEnum.<defaultValue>;
   })
   .ReverseMap();
CreateMap<MyTable, MyTableAsDTO>()
    .ReverseMap();