NoSQL,используя MongoDB, NoRM и ASP.NET MVC
В данной статье, я хотел бы рассказать, как работать с NoSQL и документо-ориентированной базой данных MongoDB, NoRM и ASP.NET MVC 2.
NoSQL и документо-ориентированная база данных
В этом году особенно заметны активные движения в направлении NoSQL и люди постоянно обсуждают о применении документо-ориентированных баз вместе с веб-приложениями. Согласно Википедии “NoSQL - движение, продвигающее свободный класс не реляционных хранилищ данных, которое прервало длинную историю реляционных баз данных. Данные хранилища могут не требовать фиксированных схем для таблиц, чаще всего избегают join-операций и обычно имеют горизонтальное масштабирование. Преподаватели часто ссылаются на подобные базы данных, как на структурированные хранилища.
Документо-ориентированные базы данных не зависимы от схем, так что вы можете сосредоточится на проблемной предметной области и не волноваться об обновлении схемы во время расширений домена, что позволяет использовать реальный доменно-ориентированный подход при разработке. Одним из основных проблемных мест в реляционных базах данных является синхронизация схемы базы данных с сущностями домена, когда сам домен развивается. На данный момент присутствует огромное количество реализаций NoSQL подхода, но мое внимание больше привлекли CouchDB и MongoDB. Наблюдая за развитием обеих баз данных, я обнаружил, что CouchDB не умеет выполнять динамические запросы, поэтому позже взял на вооружение MongoDB. Для данной базы в наличии множество драйверов под .NET.
MongoDB
MongoDB является открытым программным обеспечением, расширяемой, высокопроизводительной, свободной от схем, документо-ориентированной базой данных, написанной на C++. Разрабатывается с октября 2007 года компанией 10gen. MonoDB хранит все ваши данные в формате бинарного JSON (BSON). MongoDB привлекает все больше внимания и, как можно увидеть, получил широкое распространение в реальной жизни.
NoRM – C#-драйвер для MongoDB
NoRM является С#-драйвером для MongoDB, поддерживающим LINQ. NoRM проект доступен на Github.
Демонстрация работы с ASP.NET MVC
Я покажу простой пример с использованием MongoDB, NoRM и ASP.NET MVC. Для работы с MongoDB и NoRM проделайте следующие шаги:
- Установите MongoDB для 32bit или 64bit версию. Архивы содержат mongodb.exe для запуска сервера и mongo.exe для клиента.
- Загрузите драйвер NoRM для MongoDB
- Создайте директорию с именем “C:\data\db”. Это стандартное местоположение баз MongoDB.
- Запустите MongoDB сервер C:\Mongo\bin\mongod.exe.
Теперь, я собираюсь продемонстрировать, как создать ASP.NET MVC приложение, используя MongoDB и NoRM.
Давайте напишем класс домена.
public class Category { [MongoIdentifier] public ObjectId Id { get; set; } [Required(ErrorMessage = "Name Required")] [StringLength(25, ErrorMessage = "Must be less than 25 characters")] public string Name { get; set;} public string Description { get; set; } }
ObjectId является NoRM типом, который представляет MongoDB ObjectId. NoRM автоматически обновит Id, потому что оснащен атрибутом MongoIdentifier. Следующим шагом будет создание класса MongoSession. Он будет осуществлять любое взаимодействие с MongoDB.
internal class MongoSession : IDisposable { private readonly MongoQueryProvider provider; public MongoSession() { this.provider = new MongoQueryProvider("Expense"); } public IQueryable Queryable { get { return new MongoQuery(this.provider); } } public MongoQueryProvider Provider { get { return this.provider; } } public void Add(T item) where T : class, new() { this.provider.DB.GetCollection().Insert(item); } public void Dispose() { this.provider.Server.Dispose(); } public void Delete(T item) where T : class, new() { this.provider.DB.GetCollection().Delete(item); } public void Drop() { this.provider.DB.DropCollection(typeof(T).Name); } public void Save(T item) where T : class,new() { this.provider.DB.GetCollection().Save(item); } }
Конструктор MongoSession создаст экземпляр MongoQueryProvider, который поддерживает LINQ выражения, а также создаст базу данных с именем “Expense”. Если же база с таким именем уже присутствует, то он будет использовать уже существующую. Метод Save может быть использован, как для Insert, так и для Update операций. Если объект является новым, то создастся новая запись иначе обновятся данные документа с передаваемым ObjectId.
Давайте создадим ASP.NET MVC контроллер и методы действий для обработки CRUD сценария для класса домена Category.
public class CategoryController : Controller { //Index – Получаем список категорий public ActionResult Index() { using (var session = new MongoSession()) { var categories = session.Queryable.AsEnumerable(); return View(categories); } } //Редактируем единственную категорию [HttpGet] public ActionResult Edit(ObjectId id) { using (var session = new MongoSession()) { var category = session.Queryable .Where(c => c.Id == id) .FirstOrDefault(); return View("Save",category); } } // GET: /Category/Create [HttpGet] public ActionResult Create() { var category = new Category(); return View("Save", category); } //Добавляем или изменяем категорию [HttpPost] public ActionResult Save(Category category) { if (!ModelState.IsValid) { return View("Save", category); } using (var session = new MongoSession()) { session.Save(category); return RedirectToAction("Index"); } } //Удаляем категорию [HttpPost] public ActionResult Delete(ObjectId Id) { using (var session = new MongoSession()) { var category = session.Queryable .Where(c => c.Id == Id) .FirstOrDefault(); session.Delete(category); var categories = session.Queryable.AsEnumerable(); return PartialView("CategoryList", categories); } } }
Как вы видите, вы можете с легкостью работать с MongoDB, используя NoRM в ASP.NET MVC приложениях. Я создал репозиторий на CodePlex, где вы можете загрузить исходный код данного ASP.NET MVC приложения.
Источник - Shiju Varghese