Dapper Dommel - автомат соединения запросов c mapping - PullRequest
2 голосов
/ 28 апреля 2020

Я прошу прощения за мой плохой английский sh, но здесь все идет, я использую Dapper с Dapper Dommel для упрощения операций, таких как crud, но в Dommel's Github говорит, что он также поддерживает операции Join, поэтому я пытаюсь чтобы реализовать его в своем коде, мне удалось вернуть простую сущность с помощью Get.

Но когда я пытаюсь использовать его для более сложных операций, таких как объединение, возникает исключение.

В сообщении об ошибке говорится: SqlException: Нужно объявить скалярную переменную "@product_id ".

Но в одном Получить это работает.

Пакеты: Dapper Dommel Dapper-FluentMap.Dommel Dapper-FluentMap

GitHub Dommel https://github.com/henkmollema/Dommel

Удалось ли кому-нибудь использовать Dapper Dommel для возврата нескольких сущностей в запросах на соединение с автоматическим сопоставлением c?

public class DbContext : IDisposable
{
    public SqlConnection Connection { get; private set; }

    public DbContext()
    {
        Connection = new SqlConnection("Server=localhost;Database=BikeStores;Trusted_Connection=True;");
        OpenConnection();
    }

    private bool OpenConnection()
    {
        try
        {
            if (Connection.State != System.Data.ConnectionState.Open)
                Connection.Open();
            return true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            return false;
        }
    }

    public void Dispose() => Connection.Close();
}

Карта плавания Dommel:

 public class ProductMap : DommelEntityMap<Product>
    {
        public ProductMap()
        {
            ToTable("production.products");
            Map(m => m.Id)
                .ToColumn("product_id")
                .IsKey()
                .IsIdentity();

            Map(m => m.Name)
                .ToColumn("product_name");

            Map(m => m.BrandId)
                .ToColumn("brand_id");

            Map(p => p.CategoryId)
                .ToColumn("category_id");

            Map(p => p.ModelYear)
                .ToColumn("model_year");

            Map(p => p.ListPrice)
                .ToColumn("list_price");
        }
    }

Отображение категорий:

public class CategoryMap : DommelEntityMap<Category>
{
    public CategoryMap()
    {
        ToTable("production.categories");
        Map(m => m.Id)
            .ToColumn("category_id")
            .IsKey()
            .IsIdentity();

        Map(m => m.Name)
            .ToColumn("category_name");
    }
}

Отображения регистров:

public RegisterMappings()
{
    FluentMapper.Initialize(config =>
    {
        config.AddMap(new ProductMap());
        config.AddMap(new CategoryMap());
        config.ForDommel();
    });
}

Модель:

   public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int BrandId { get; set; }
        public int CategoryId { get; set; }
        public Category Category { get; set; }
        public int ModelYear { get; set; }
        public decimal ListPrice { get; set; }
    }

Получите простой, который работает:

        using (var connect = new DbContext())
        {
            var product = connect.Connection.Get<Product>(id);
            return product;
        }

Получить Не работает:

    using (var connect = new DbContext())
    {
        var prod = connect.Connection.Get<Product, Category, Product>(1, (product, category) =>
        {
            product.Category = category;
            return product;
        });

        return prod;
    }
...