需要查找用于映射的值时,还有另一种处理数据库的方法吗?在映射逻辑中进行数据库调用似乎很丑陋。这还怎么处理?
例如,一个表存储了一个SEXID,因此使用下面的解析器,我可以执行以下操作
CreateMap<StagingPerson, Person>()
.ForMember( dest => dest.SEXID,
m => m.ResolveUsing<SexLookupResolver>().FromMember( src => src.Gender ) );
public class SexLookupResolver : ValueResolver<string, int>
{
protected override int ResolveCore( string source )
{
int id = -1;
if (source == "Male")
id = dataAccess.GetGenderByString("M");
else if(source == "Female")
id = dataAccess.GetGenderByString("F");
else if(source == "?")
id = dataAccess.GetGenderByString("?");
else
id = dataAccess.GetGenderByString("?");
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
数据访问:
public int GetGenderByString(string gender)
{
string sql = "select sexid from Sexes where sex = '" + gender "'";
int sexid = .....
......
return sexid;
}
Run Code Online (Sandbox Code Playgroud)
通过向类添加另一个字段来存储性别的字符串版本解决了这个问题。映射更改为映射到字符串,并且 SEXID 字段将被忽略并稍后在 DAL 操作期间设置。
CreateMap<StagingPerson, Person>()
.ForMember( dest => dest.SexString, u => u.MapFrom( src => src.Sex) )
.ForMember( dest => dest.SEXID, u.Ignore() ) );
/// The source class
public class StagingPerson
{
/// holds "M", "F", "U", "?", etc
public string Gender {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
和
/// the destination class
public class Person
{
public int SEXID {get;set;}
// New property to store the source string value
// looked up in the Data Access Layer to determine the sexId
public string SexString {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |