Dapper Rainbow - Как указать имя таблицы в другой схеме

Я довольно новичок в Dapper Rainbow, поэтому я могу упустить что-то очевидное. Можно ли указать имя таблицы и если да, то как?

Я попробовал следующее без удачи.

public class DashboardContext : Database<DashboardContext>
{
    public DashboardContext()
    {
       this.DashboardResults = new Table<DashboardResult>(this, "Monitor.DashboardResult");
    }

    public Table<DashboardResult> DashboardResults { get; set; }
}

4 ответа

У меня была такая же проблема, но, похоже, ошибка в коде. Я только что прокомментировал строки, где устанавливается конструктор для таблиц (Database.cs), и он работает.

    internal void InitDatabase(DbConnection connection, int commandTimeout)
    {
        this.connection = connection;
        //this.commandTimeout = commandTimeout;
        //if (tableConstructor == null)
        //{
        //    tableConstructor = CreateTableConstructorForTable();
        //}

        //tableConstructor(this as TDatabase);
    }

Я думаю, это не лучшее решение...

Вам нужно взломать источник радуги, чтобы заставить его работать. Найти CreateTableConstructor метод в файле DataBase.cs. Просто добавьте немного кода следующим образом:

...
var setters = GetType().GetProperties()
    .Where(p => p.GetValue(this, null) == null 
             && p.PropertyType.IsGenericType 
             && p.PropertyType.GetGenericTypeDefinition() == tableType)
    .Select...

Для всех, кто спотыкается об этом посте, как я, это исправлено в Dapper.Rainbow версии 0.1.3.

В настоящее время он все еще находится в бета-версии (0.1.3-бета1), поэтому, если вы хотите использовать схему, вы можете клонировать / разветвлять репозиторий и запустить скрипт сборки. Затем двоичный вывод можно использовать напрямую или в упаковке.

Что касается настройки таблицы, вам нужно определить имя таблицы с именем схемы для этой конкретной таблицы, поэтому, например, посмотрите на этот пример без схемы

    public class MyDatabase : Database<MyDatabase>
    {
        public Table<Order> Order{ get; set; }
        public Table<Customer> Customer { get; set; }
        public Table<Item> Item { get; set; }
    }

Что работает, если вы используете только DBO. но если вы, например, используете, скажем, схему Product для Item, вам придется определить ее с помощью конструктора

    public class MyDatabase : Database<MyDatabase>
    {
        public Table<Order> Order{ get; set; }
        public Table<Customer> Customer{ get; set; }
        public Table<Item> Item;

        public MyDatabase()
        {
            Item = new Table<Item>(this, "Product.Item");
        }
    }

Остальное должно быть как раньше

     using (var connection = DbConnections.Create())
     {
            connection.Open();
            var db = MyDatabase.Init((DbConnection)connection, commandTimeout: 2);
            var insert = db.Customer.Insert(
            // .
            //..... your object
            // .
            );
            var insertId = insert.Value;
     }

Основываясь на ответе @Acorax, мне этого было недостаточно, мне нужно было добавить скобки к схеме и имени таблицы, чтобы решить эту проблему.

Итак, это решило проблему со схемой:

      public class MyDatabase : Database<MyDatabase>
{
    public Table<Item> Items;

    public HamenasDbSchema()
    {
        Items = new Table<User>(this, "[Schema].[Items]");
    }
}
Другие вопросы по тегам