Пользовательские расширения Dapper ClassMapper не вызывается при вставке () - PullRequest
1 голос
/ 01 ноября 2019

Я использую Dapper Extensions и определил свой собственный маппер для работы с сущностями с составными ключами.

     public class MyClassMapper<T> : ClassMapper<T> where T : class
{
    public MyClassMapper()
    {
        // Manage unmappable attributes

        IList<PropertyInfo> toIgnore = typeof(T).GetProperties().Where(x => !x.CanWrite).ToList();

        foreach (PropertyInfo propertyInfo in toIgnore.ToList())
        {
            Map(propertyInfo).Ignore();
        }

        // Manage keys

        IList<PropertyInfo> propsWithId = typeof(T).GetProperties().Where(x => x.Name.EndsWith("Id") || x.Name.EndsWith("ID")).ToList();
        PropertyInfo primaryKey = propsWithId.FirstOrDefault(x => string.Equals(x.Name, $"{nameof(T)}Id", StringComparison.CurrentCultureIgnoreCase));

        if (primaryKey != null && primaryKey.PropertyType == typeof(int))
        {
            Map(primaryKey).Key(KeyType.Identity);
        }
        else if (propsWithId.Any())
        {
            foreach (PropertyInfo prop in propsWithId)
            {
                Map(prop).Key(KeyType.Assigned);
            }
        }

        AutoMap();
    }
}

У меня также есть этот тестовый пример, чтобы проверить мой маппер:

    [Test]
    public void TestMyAutoMapper()
    {
        DapperExtensions.DapperExtensions.DefaultMapper = typeof(MyClassMapper<>);

        MySubscribtionEntityWithCompositeKey entity = new MySubscribtionEntityWithCompositeKey
        {
            SubscriptionID = 145,
            CustomerPackageID = 32
        };

        using (var connection = new SqlConnection(CONNECTION_STRING))
        {
            connection.Open();
            var result = connection.Insert(entity);
            var key1 = result.SubscriptionID;
            var key2 = result.CustomerPackageID;
        }
    }

Обратите внимание, что я установил маппер по умолчанию в тестовом примере.

Вставка не удалась, и я заметил, что мой клиентский маппер никогда не вызывается. У меня нет документации на странице github по этой теме, поэтому я не уверен, что мне нужно что-то еще сделать, чтобы расширения dapper использовали мой mapper.

Заранее спасибо!

1 Ответ

1 голос
/ 04 ноября 2019

Глядя на ваш вопрос, вы пытаетесь написать свой собственный defalut преобразователь классов, полученный из существующего. Я никогда не использовал этот подход;поэтому я не знаю, почему он не работает или должен работать.

Я явно отображаю классы, как показано ниже:

public class Customer
{
    public int CustomerID { get; set; }
    public string Name { get; set; }
}

public sealed class CustomerMapper : ClassMapper<Customer>
{
    public CustomerMapper()
    {
        Schema("dbo");
        Table("Customer");
        Map(x => x.CustomerID).Key(KeyType.Identity);
        AutoMap();
    }
}

AutoMap() отобразит остальные свойства на основена конвенций . Пожалуйста, обратитесь к этим двум ресурсам для получения дополнительной информации о сопоставлении.

Затем я вызываю SetMappingAssemblies при запуске проекта, как показано ниже:

DapperExtensions.DapperExtensions.SetMappingAssemblies(new[] { Assembly.GetExecutingAssembly() });

GetExecutingAssembly() используется в приведенном выше коде, потому что классы отображения (CustomerMapper и другие) находятся в той же сборке, которая выполняется. Если эти классы помещены в другую сборку, предоставьте эту сборку вместо этого.

И все, все работает.

Чтобы установить диалект, я вызываю следующую строку чуть нижеSetMappingAssemblies:

DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqlServerDialect();

Используйте предпочитаемый вами диалект вместо SqlServerDialect.

Очевидно, упомянутое решение здесь может помочь вам достичь того, что вы на самом делепытаясьНо я не могу быть уверен, как я уже говорил выше, я никогда не использовал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...