使用 HasDefaultValueSql 的 AutoMapper
AutoMapper utilizing HasDefaultValueSql
在我的 Entity Framework Core 2.2 API 项目中,我构建了上下文。因为它代表来自我的数据库的数据,所以我得到类似 -
的条目
entity.Property(e => e.Active)
.IsRequired()
.HasDefaultValueSql("((1))");
其中 Active
是必需的,默认值为 1。
我也在使用 AutoMapper 映射实体。
我的映射实体class -
public class MappingEntity : Profile
{
public MappingEntity()
{
CreateMap<MemberUpdate, Member>();
}
}
这会将 ViewModel MemberUpdate
映射到我的数据库对象 Member
我的控制器中似乎丢失了默认值 -
public ActionResult Account(int id, [FromBody]MemberUpdate updatedMember)
{
Member member = _memberRepository.GetById(id);
//HERE MY MEMBER OBJECT IS CORRECT AND `ACTIVE` HAS IT'S DEFAULT VALUE
member = _mapper.Map<Member>(updatedMember);
//HERE MY MEMBER OBJECT IS INCORRECT AND THE ACTIVE FIELD DOES NOT SHOW THE DEFAULT VALUE
//proceed to save back to the database
}
是否有 AutoMapper 设置来保留默认值?
AutoMapper 无法保留您的默认值,因为它甚至不知道它的存在。
.HasDefaultValueSql("((1))");
是EntityFramework在构造对象时使用的设置,但是在这种情况下AutoMapper是在构造对象,所以信息丢了。
但是,您 可以 做的是,将一些自定义逻辑应用到您的映射以在之后添加默认值。它看起来像下面这样:
CreateMap<MemberUpdate, Member>()
.AfterMap((memberUpdate, member) =>
member.Active = memberUpdate.Active == default(int) ? 1 : memberUpdate.Active);
这只是在 Member
和 MemberUpdate
之间进行默认映射,然后 之后 为 Member
分配您想要的默认值。
或者,您可以将模型更改为在其中具有默认值,而不是像这样在外部进行赋值:
public int Active { get; } = 1;
虽然我怀疑该选项是否对您有用,因为您希望 EF 为您处理。我建议将硬编码的 1
剥离到某个地方的常量,然后在 AutoMapper 映射和 EF 设置中使用该常量。
希望对您有所帮助。
在我的 Entity Framework Core 2.2 API 项目中,我构建了上下文。因为它代表来自我的数据库的数据,所以我得到类似 -
的条目entity.Property(e => e.Active)
.IsRequired()
.HasDefaultValueSql("((1))");
其中 Active
是必需的,默认值为 1。
我也在使用 AutoMapper 映射实体。
我的映射实体class -
public class MappingEntity : Profile
{
public MappingEntity()
{
CreateMap<MemberUpdate, Member>();
}
}
这会将 ViewModel MemberUpdate
映射到我的数据库对象 Member
我的控制器中似乎丢失了默认值 -
public ActionResult Account(int id, [FromBody]MemberUpdate updatedMember)
{
Member member = _memberRepository.GetById(id);
//HERE MY MEMBER OBJECT IS CORRECT AND `ACTIVE` HAS IT'S DEFAULT VALUE
member = _mapper.Map<Member>(updatedMember);
//HERE MY MEMBER OBJECT IS INCORRECT AND THE ACTIVE FIELD DOES NOT SHOW THE DEFAULT VALUE
//proceed to save back to the database
}
是否有 AutoMapper 设置来保留默认值?
AutoMapper 无法保留您的默认值,因为它甚至不知道它的存在。
.HasDefaultValueSql("((1))");
是EntityFramework在构造对象时使用的设置,但是在这种情况下AutoMapper是在构造对象,所以信息丢了。
但是,您 可以 做的是,将一些自定义逻辑应用到您的映射以在之后添加默认值。它看起来像下面这样:
CreateMap<MemberUpdate, Member>()
.AfterMap((memberUpdate, member) =>
member.Active = memberUpdate.Active == default(int) ? 1 : memberUpdate.Active);
这只是在 Member
和 MemberUpdate
之间进行默认映射,然后 之后 为 Member
分配您想要的默认值。
或者,您可以将模型更改为在其中具有默认值,而不是像这样在外部进行赋值:
public int Active { get; } = 1;
虽然我怀疑该选项是否对您有用,因为您希望 EF 为您处理。我建议将硬编码的 1
剥离到某个地方的常量,然后在 AutoMapper 映射和 EF 设置中使用该常量。
希望对您有所帮助。