Under Model create a demo class book.we need to install packages FluentNHibernate,nhibernate.
Book.cs
namespace nhibernate_mvc.Models
{
public class Book
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string Author { get; set; }
public virtual string Genre { get; set; }
public virtual string Name { get; set; }
public virtual string MajorVersion { get; set; }
public virtual string MinorVersion { get; set; }
}
}
In same Model directory create BookMap.cs class as follows
BookMap.cs
using FluentNHibernate.Mapping;
namespace nhibernate_mvc.Models
{
public class BookMap : ClassMap<Book>
{
public BookMap()
{
Id(x => x.Id).Column("id").Not.Nullable();
Map(x => x.Title).Column("title").Not.Nullable();
Map(x => x.Author).Column("author").Not.Nullable();
Map(x => x.Genre).Column("genre").Not.Nullable();
Map(x => x.Name).Column("name").Not.Nullable();
Map(x => x.MajorVersion).Column("majorversion").Not.Nullable();
Map(x => x.MinorVersion).Column("minorversion").Not.Nullable();
Table("book");
}
}
}
Create Repository.cs class in Model again
using System;
using System.Collections.Generic;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using Microsoft.Extensions.Configuration;
using nhibernate_mvc.Settings;
using Microsoft.Extensions.Options;
namespace nhibernate_mvc.Models
{
public sealed class Repository
{
ISessionFactory _sessionFactory;
ISession _session;
public string _Conf { get; private set; }
public Repository(string conf)
{
_Conf = conf;
InitializeSession();
}
void InitializeSession()
{
try
{
//var conString = "User ID= xdba; Password= sangram; Server= localhost; Port=5432; Database= sangram; Integrated Security=true; Pooling = true;";
_sessionFactory = Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.PostgreSQLConfiguration.PostgreSQL82
.ConnectionString(_Conf))
.Mappings(m => m
.FluentMappings.AddFromAssemblyOf<Repository>())
.BuildSessionFactory();
_session = _sessionFactory.OpenSession();
}
catch (Exception ex)
{
throw ex;
}
}
public IList<Book> GetAllBooks()
{
try
{
return _session.QueryOver<Book>().List();
}
catch (Exception ex)
{
throw ex;
}
}
public Book GetBook(int id)
{
try
{
return _session.Get<Book>(id);
}
catch (Exception ex)
{
throw ex;
}
}
public Book AddBook(Book Book)
{
Book entity = null;
using (var transaction = _session.BeginTransaction())
{
try
{
entity = _session.Save(Book) as Book;
transaction.Commit();
}
catch (StaleObjectStateException ex)
{
try
{
entity = _session.Merge(Book);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
return entity;
}
}
public void UpdateBook(Book Book)
{
using (var transaction = _session.BeginTransaction())
{
try
{
_session.Update(Book);
transaction.Commit();
}
catch (StaleObjectStateException ex)
{
try
{
_session.Merge(Book);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
}
public void DeleteBook(int id)
{
using (var transaction = _session.BeginTransaction())
{
var Book = _session.Get<Book>(id);
if (Book != null)
{
try
{
_session.Delete(Book);
transaction.Commit();
}
catch (StaleObjectStateException ex)
{
try
{
_session.Merge(Book);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
}
}
}
}
Now in BookController.cs we can use Nhibernate to do CRUD Operations
Our BookController.cs look like below
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using nhibernate_mvc.Models;
using nhibernate_mvc.Settings;
using Microsoft.Extensions.Configuration;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
namespace nhibernate_mvc.api
{
[Route("api/[controller]")]
public class BookController : Controller
{
private IConfiguration Configuration;
private readonly IOptions<ApplicationSettings> _AppSettings;
Repository _repository ;
public BookController(IConfiguration _configuration,IOptions<ApplicationSettings> AppSetting)
{
Configuration = _configuration;
_repository = new Repository(_configuration.GetConnectionString("Connectionstring"));
_AppSettings = AppSetting;
}
// GET: api/values
[HttpGet]
public IEnumerable<Book> Get()
{
return _repository.GetAllBooks();
}
// GET api/values/5
[HttpGet("{id}")]
public IActionResult Get(int id)
{
var Book = _repository.GetBook(id);
if (Book != null)
return new ObjectResult(Book);
else
return new NotFoundResult();
}
// POST api/values
[HttpPost]
public IActionResult Post([FromBody]Book Book)
{
if (Book.Id == 0)
{
Book.Name = _AppSettings.Value.Name;
Book.MajorVersion = _AppSettings.Value.MajorVersion;
Book.MinorVersion = _AppSettings.Value.MinorVersion;
Book newBook = _repository.AddBook(Book);
return new ObjectResult(newBook);
}
else
{
var existingOne = _repository.GetBook(Book.Id);
existingOne.Author = Book.Author;
existingOne.Title = Book.Title;
existingOne.Genre = Book.Genre;
existingOne.Name = _AppSettings.Value.Name;
existingOne.MajorVersion = _AppSettings.Value.MajorVersion;
existingOne.MinorVersion = _AppSettings.Value.MinorVersion;
_repository.UpdateBook(existingOne);
return new ObjectResult(existingOne);
}
}
// PUT api/values/5
[HttpPut("{id}")]
public IActionResult Put(int id, [FromBody]Book Book)
{
var existingOne = _repository.GetBook(id);
existingOne.Author = Book.Author;
existingOne.Title = Book.Title;
existingOne.Genre = Book.Genre;
existingOne.Name = _AppSettings.Value.Name;
existingOne.MajorVersion = _AppSettings.Value.MajorVersion;
existingOne.MinorVersion = _AppSettings.Value.MinorVersion;
_repository.UpdateBook(existingOne);
return new ObjectResult(existingOne);
}
// DELETE api/values/5
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
_repository.DeleteBook(id);
return new StatusCodeResult(200);
}
}
}
Our Book Table in Database looks like
CREATE TABLE Book (
id serial,
title VARCHAR (50) NULL,
author VARCHAR (50) NULL,
genre VARCHAR (50) NULL,
name VARCHAR (50) NULL,
majorversion VARCHAR (50) NULL,
minorversion VARCHAR (50) NULL,
PRIMARY KEY (Id)
);
Here is appsettings.json for the project
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"Connectionstring":"User ID= xdba; Password= sangram; Server= localhost; Port=5432; Database= sangram; Integrated Security=true; Pooling = true; "
},
"Application": {
"Name": "NhibernateMvc",
"MajorVersion": "1",
"MinorVersion": "8"
}
}
Complete code is available at https://github.com/gitsangramdesai/nhibernate-aspnet-core
No comments:
Post a Comment