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