Search This Blog

2020/12/10

ASP.NET CORE MVC implementing NHibernate

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