在我的Entity Framework Core 2.2 API项目中,我建立了上下文。因为它代表了我数据库中的数据,所以我得到了-
entity.Property(e => e.Active)
.IsRequired()
.HasDefaultValueSql("((1))");
其中Active
是必需的,默认值为1。
我也在使用AutoMapper映射实体。
我的MappingEntity类-
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设置来保留默认值?
答案 0 :(得分:2)
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设置中使用该常量。
希望有帮助。