На этот раз мы подойдем к мэппингу POCO объектов несколько с другой стороны. Бывают ситуации, когда вы не должны использовать ORM по тем или иным причинам, например — пожелание заказчика или какие то другие факторы (например, разработка для мобильных устройств).
Что делать в этом случае? Остается один лишь ADO .NET с нашими любимыми DbCommand и DbConnection.
А вот и есть выход! Легковесная библиотека, позволяющая использовать некоторые преимущества ORM мэппинга без использования непосредственно ORM.
Имя ей — Fluent Ado.NET. Знакомьтесь!
Официальная страничка этого чуда на Codeplex: fluentado.codeplex.com
Исходный код можно взять здесь через SVN: FluentAdo.svn.codeplex.com/svn
Компилим скачанные исходники. Если при компиляции возникнут ошибки — советую удалть из солюшена ссылки на проекты тестов и сделать ребилд снова.
Что мы имеем внутри солюшена? Четыре проекта:
* FluentAdo.Generic
* FluentAdo.Oledb
* FluentAdo.Oracle
* FluentAdo.SQLite
Мне по нраву пришелся первый 🙂
По большому счету в исходниках написаны шаблоны, которые вы без труда сможете продублировать в своем основном проекте. Однако есть возможность использовать ссылку готовую библиотеку, подключив к проекту. Ниже мы рассмотрим второй вариант.
Весь синтаксис SQL будет отныне находиться под вашим бдительным взором, вы не должны пропустить ни единого поля. Чаще всего вы будете иметь дело с классом FluentCommand<>, который выполняет SQL запрос и производит мэппинг результатов. Команде нужно будет указать явно соединение примерно так:
1 2 3 4 |
SqlConnection myConnection = new SqlConnection(myConnectionString); FluentCommand<Order> cmd = new FluentCommand<Order>(); cmd.SetConnection(myConnection); |
Классы из DAL останутся теми же (POCO):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Product { public string Code { get; set; } public int ProductNumber { get; set; } public string Name { get; set; } public double Price { get; set; } } public class Order { public int OrderNumber { get; set; } public string Comment { get; set; } public DateTime Date { get; set; } public int Count { get; set; } public Customer Customer { get; set; } public Product Product { get; set; } } |
А чтобы осуществить выборку из базы (конечно, база должна быть создана), нужно написать следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public static Product GetProductByNumber(int number) { SqlConnection myConnection = GetSqlConnection(); string sql = "select Code, ProductNumber, Name, Price from Product where ProductNumber = @ProductNumber"; return new FluentCommand<Product>(sql) .SetConnection(myConnection) .AddInt("ProductNumber", number) .SetMap(x => new Product { Code = x.GetString("Code"), Name = x.GetString("Name"), ProductNumber = x.GetInt("ProductNumber"), Price = x.GetValue<Double>("Price"), }) .AsSingle(); } public static List<Product> GetProductList() { SqlConnection myConnection = GetSqlConnection(); string sql = "select Code, ProductNumber, Name, Price from Product"; return new FluentCommand<Product>(sql) .SetConnection(myConnection) .SetMap(x => new Product { Code = x.GetString("Code"), Name = x.GetString("Name"), ProductNumber = x.GetInt("ProductNumber"), Price = x.GetValue<Double>("Price"), }) .AsList(); } |
Здесь мы опустили GetSqlConnection, потому что он это к делу не относится 😉
Есть еще много над чем подумать, например, каскадная загрузка таблиц (Product <-> Order), как мы делали это при использовании Fluent NHibernate.
Но в общем и целом технология очень удобна, и, если вы не хотите использовать ничего тяжеловесного, а наоборот, хотите получить полный контроль над Sql-командами, выполнением запросов и тп., то FluentAdo .NET — для вас.
Похожие записи: