14 May 2010

NoSQL, используя MongoDB, NoRM и ASP.NET MVC

ASP
Translation
Original author: Shiju Varghese


В данной статье, я хотел бы рассказать, как работать с 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 проделайте следующие шаги:
  1. Установите MongoDB для 32bit или 64bit версию. Архивы содержат mongodb.exe для запуска сервера и mongo.exe для клиента.
  2. Загрузите драйвер NoRM для MongoDB
  3. Создайте директорию с именем “C:\data\db”. Это стандартное местоположение баз MongoDB.
  4. Запустите 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<tentity> : IDisposable
{
  private readonly MongoQueryProvider provider;

  public MongoSession()
  {
    this.provider = new MongoQueryProvider("Expense");
  }

  public IQueryable<tentity> Queryable
  {
    get { return new MongoQuery<tentity>(this.provider); }
  }

  public MongoQueryProvider Provider
  {
    get { return this.provider; }
  }

  public void Add<t>(T item) where T : class, new()
  {
    this.provider.DB.GetCollection<t>().Insert(item);
  }

  public void Dispose()
  {
    this.provider.Server.Dispose();
  }

  public void Delete<t>(T item) where T : class, new()
  {
    this.provider.DB.GetCollection<t>().Delete(item);
  }

  public void Drop<t>()
  {
    this.provider.DB.DropCollection(typeof(T).Name);
  }

  public void Save<t>(T item) where T : class,new()
  {
    this.provider.DB.GetCollection<t>().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<category>())
  {
    var categories = session.Queryable.AsEnumerable<category>();
    return View(categories);
  }
}

//Редактируем единственную категорию
[HttpGet]
public ActionResult Edit(ObjectId id)
{
  using (var session = new MongoSession<category>())
  {
    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<category>())
  {
    session.Save(category);
    return RedirectToAction("Index");
  }
}

//Удаляем категорию
[HttpPost]
public ActionResult Delete(ObjectId Id)
{
  using (var session = new MongoSession<category>())
  {
    var category = session.Queryable
       .Where(c => c.Id == Id)
       .FirstOrDefault();
    session.Delete(category);
    var categories = session.Queryable.AsEnumerable<category>();
    return PartialView("CategoryList", categories);
  }
}   
}

Как вы видите, вы можете с легкостью работать с MongoDB, используя NoRM в ASP.NET MVC приложениях. Я создал репозиторий на CodePlex, где вы можете загрузить исходный код данного ASP.NET MVC приложения.
Tags: asp.net mvc nosql mongodb
Hubs: ASP
+18
11.6k 65
Comments 23
Ads
Top of the day