Friday, 30 June 2017

Blog No Baap

How to add new tables to NopCommerce

How to add new tables to NopCommerce without deleting my data from database. Here is the Step by step explanation for how to add new table on NopCommerce.
Open source code on visual studio then follow the below steps.
Step 1
Open this path \Libraries\Nop.Core\Domain and create one folder under this path and folder name is "User".
Create the Entity class and give name "UserMaster.cs".
public partial class UserMaster : BaseEntity
{
    public string Name { get; set; }

    public int Age { get; set; }

    public string Address { get; set; }
}
Step 2
Open this path \Libraries\Nop.Data\Mapping and create one folder under this path and folder name is "User".
Create a Mapping class which bind class to Database table and give name "UserMasterMap.cs".
public partial class UserMasterMap : NopEntityTypeConfiguration<UserMaster>
{
    public UserMasterMap()
    {
        this.ToTable("UserMaster"); // Provide Table Name
        this.HasKey(um => um.Id);
        this.Property(um => um.Name).IsRequired();
        this.Property(um => um.Age).IsRequired();
    }
}
Step 3
Open this path ~\Nop.Admin\Models and create one folder under this path and folder name is "User".
Create a Model class for MVC and give name "UserMasterModel.cs". (Same for Nop.Web)
public partial class UserMasterModel : BaseNopEntityModel
{
    [NopResourceDisplayName("Admin.UserMaster.Fields.Name")]
    public string Name { get; set; }

    [NopResourceDisplayName("Admin.UserMaster.Fields.Age")]
    public int Age { get; set; }

    [NopResourceDisplayName("Admin.UserMaster.Fields.Address")]
    public string Address { get; set; }
}
Step 4
Open this path ~\Nop.Admin\Validators and create one folder under this path and folder name is "User".
Create a Validator class for MVC and give name "UserMasterValidator.cs". (Same for Nop.Web)
public partial class UserMasterValidator : BaseNopValidator<UserMasterModel>
{
    public UserMasterValidator(ILocalizationService localizationService, IDbContext dbContext)
    {
        RuleFor(x => x.Name).NotEmpty().WithMessage(localizationService.GetResource("Admin.UserMaster.Fields.Name.Required"));

        SetStringPropertiesMaxLength<UserMaster>(dbContext);
    }
}
Step 5
Open this path ~\Nop.Admin\Infrastructure.
Open AutoMapperConfiguration.cs class and write below code for Mapping Model to Entity and Entity to Model. (Same for Nop.Web)
// UserMaster, you can ignore properties here
cfg.CreateMap<UserMaster, UserMasterModel>()
    .ForMember(dest => dest.CustomProperties, mo => mo.Ignore());
cfg.CreateMap<UserMasterModel, UserMaster>();
Step 6
Open this path ~\Nop.Admin\Extensions.
Open MappingExtensions.cs class and write below code for Mapping Model to Entity and Entity to Model. (Same for Nop.Web)
#region UserMaster

//UserMaster
public static UserMasterModel ToModel(this UserMaster entity)
{
    return entity.MapTo<UserMaster, UserMasterModel>();
}

public static UserMaster ToEntity(this UserMasterModel model)
{
    return model.MapTo<UserMasterModel, UserMaster>();
}

public static UserMaster ToEntity(this UserMasterModel model, UserMaster destination)
{
    return model.MapTo(destination);
}

#endregion
Step 7
Open this path ~\Libraries\Nop.Services and create one folder under this path and folder name is "User".
Create a interface and give name "IUserMasterService.cs". (Same for Nop.Web)
public partial interface IUserMasterService
{
    void InsertUser(UserMaster userMaster);

    void UpdateUser(UserMaster userMaster);

    UserMaster GetUserById(int userId);

    void DeleteUser(UserMaster userMaster);  
}
Create a below new class and give name "UserMasterService.cs". (Same for Nop.Web)
This method is only for insert new record in UserMaster Table. Here you can create methods whatever you want.
public partial class UserMasterService : IUserMasterService
{
    #region Fields

    private readonly IRepository<UserMaster> _userMasterRepository;
    private readonly IEventPublisher _eventPublisher;

    #endregion

    #region Ctor

    public UserMasterService(IRepository<UserMaster> userMasterRepository,
        IEventPublisher eventPublisher)
    {
        this._userMasterRepository = userMasterRepository;
        this._eventPublisher = eventPublisher;
    }

    #endregion

    public virtual void InsertUser(UserMaster userMaster)
    {
        if (userMaster == null)
            throw new ArgumentNullException("userMaster");

        _userMasterRepository.Insert(userMaster);

        //event notification
        _eventPublisher.EntityInserted(userMaster);
    }
}
Step 8
Open this path ~\Nop.Web.Framework and open DependencyRegistrar.cs and register your service and interface like this
// UserMaster
builder.RegisterType<UserMasterService>().As<IUserMasterService>().InstancePerLifetimeScope();

Step 9
Create table in NopCommerce database and give name "UserMaster". 
Table structure like this
NopCommerce UserMaster Table
Note: Manually create table in database is necessary.
Step 10
Create new controller and give name "UserMasterController.cs"
public partial class UserMasterController : BaseAdminController
{
    #region Fields

    private readonly IUserMasterService _userMasterService;

    #endregion

    #region Constructors

    public UserMasterController(IUserMasterService userMasterService)
    {
        this._userMasterService = userMasterService;
    }

    #endregion

    public ActionResult Create()
    {
        if (!_permissionService.Authorize(StandardPermissionProvider.ManageUserMaster))
            return AccessDeniedView();

        var model = new UserMasterModel();

        return View(model);
    }

    [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")]
    public ActionResult Create(UserMasterModel model, bool continueEditing)
    {
        if (!_permissionService.Authorize(StandardPermissionProvider.ManageUserMaster))
            return AccessDeniedView();

        if (ModelState.IsValid)
        {
            var userMaster = model.ToEntity();
            _userMasterService.InsertUser(userMaster);
        }
        return RedirectToAction("List");
    }
}
Create View for action method.
Now finally build your project and run application. If there is any issue comment below.
Read More

Thursday, 29 June 2017

Blog No Baap

SQL Server Interview: If Outer transaction ROLLBACK, what happens to Inner transaction

I hope you know that we can create nested transactions in SQL Server. If you are giving a SQL Server developer interview, an interviewer may ask a question like If Outer transaction ROLLBACK, what happens to an Inner transaction in SQL Server.
The interviewer can also write code in paper and can ask a developer to solve it.
You can find the answer in below demonstration so test it yourself.
Create a sample table:
Open outer and inner transaction and insert few sample records:
Check the count of your table:
Now, Rollback your Outer transactions:
Now, Check the count of your table:
Which is 0 now. Although you committed inner transaction for those 1000 records, outer transaction was not committed, so it rollbacked all transactions.
Read More