Добавление нескольких карт при использовании расширений Dapper
Я использую расширения Dapper и у меня есть вопрос о сопоставителях классов. К сожалению, большинству моих таблиц нужно сопоставить их, например, различные схемы и т. Д.
Таким образом, я обнаружил, что обычно делаю много обменивать DefaultMapper, как показано ниже:
public Hierarchies HierarchyGetByName(string aName)
{
Hierarchies result;
using (SqlConnection cn = GetSqlConnection())
{
cn.Open();
Type currModelMapper = DapperExtensions.DapperExtensions.DefaultMapper;
try
{
DapperExtensions.DapperExtensions.DefaultMapper = typeof(HierarchiesMapper);
IFieldPredicate predicate = Predicates.Field<Hierarchies>(f => f.Name, Operator.Eq, aName);
result = cn.GetList<Hierarchies>(predicate).FirstOrDefault();
}
finally
{
DapperExtensions.DapperExtensions.DefaultMapper = currModelMapper;
}
cn.Close();
}
return result;
}
Если я получаю доступ к 2 таблицам, то я должен сделать это дважды, например.
Есть ли способ добавить все классы картографирования одновременно, чтобы сказать коллекцию, и в зависимости от того, к какой таблице осуществляется доступ, выбирается правильный?
1 ответ
Вы можете добавить набор классов в ваше приложение, которые применяют настраиваемое переназначение к вашим сущностям. Например, эти 3 пустых класса применяют PrefixDapperTableMapper к классам Profile и FileNotificationAdhocRecipient, в то время как AnotherDifferentTypeOfDapperClassMapper применяется к NotificationProfile.
public class ProfileMapper : PrefixDapperTableMapper<Domain.Entities.Profile>
{
}
public class FileNotificationAdhocRecipientMapper : PrefixDapperTableMapper<Domain.Entities.FileNotificationAdhocRecipient>
{
}
public class NotificationProfileMapper : AnotherDifferentTypeOfDapperClassMapper<Domain.Entities.NotificationProfile>
{
}
и ваш фактический код сопоставления существует в отдельных средствах сопоставления (я не показывал AnotherDifferentTypeOfDapperClassMapper, но это будет аналогично приведенному ниже)
public class PrefixDapperTableMapper<T> : ClassMapper<T> where T : class
{
public PrefixDapperTableMapper()
{
AutoMap();
}
//name or schema manipulations in some overrides here.
}
Пока они находятся в одной сборке, DapperExtensions найдет и использует их, или вы можете установить сборку сопоставления с кодом, подобным следующему:
DapperExtensions.DapperExtensions.SetMappingAssemblies({ typeof(ProfileMapper ).Assembly })