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]");
}
}