Добавление нескольких карт при использовании расширений 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 })
Другие вопросы по тегам