locked
Database first approach with DI plugin RRS feed

  • Question

  • User-171003712 posted

    Dear All,

    I have seen many project those using Code first and using DI with Autofac IoC . My point is im upgrading or rewritten my monolithic application to new pattern like DI , IoC and plugin so study many projects like NOPnopcommerce etc. But my limitation is i have to use my existing db and use DB first approach. so i convert one application and use DB first and with Autofac , and create one db Model and create one manually interface and register but problem is every time db model update then every time have to inherit the Interface to DB model like  MyDbContext :DbContext, IMyDbContext so every time have update with Interface. so i have to solve this one problem . 

    next i have google and getting db first approach but they using new keyword and create a object which is i already handle by Autofac.

    public class Customer     
    {
        DIDbContext dbContext = new DIDbContext();
        public int Create(Customer customer)
        {
            if (customer != null)
            {
                dbContext.Customers.Add(customer);
                dbContext.SaveChanges();
                return 1;
            }
            return 0;
        }
        public IEnumerable<customer> GetAllCustomers()
        {
            return dbContext.Customers.ToList();
        }
    }

    so i dont want to create new object every time which is alredy handle by Autofac.

    so please give me some idea with DB first and without new object in every repository.



    //------------------------------------------------------------------------------
    // <auto-generated>
    // This code was generated from a template.
    //
    // Manual changes to this file may cause unexpected behavior in your application.
    // Manual changes to this file will be overwritten if the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------

    namespace Repository_Database
    {
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Core.Objects;
    using System.Linq;

    public partial class Northwind_DBEntities : DbContext, Repository_Database.INorthwind_DBEntities
    {
    public Northwind_DBEntities()
    : base("name=Northwind_DBEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<Category> Categories { get; set; }
    public virtual DbSet<CustomerDemographic> CustomerDemographics { get; set; }
    public virtual DbSet<Customer> Customers { get; set; }
    public virtual DbSet<Employee> Employees { get; set; }
    public virtual DbSet<Order_Detail> Order_Details { get; set; }
    public virtual DbSet<Order> Orders { get; set; }
    public virtual DbSet<Product> Products { get; set; }
    public virtual DbSet<Region> Regions { get; set; }
    public virtual DbSet<Shipper> Shippers { get; set; }
    public virtual DbSet<Supplier> Suppliers { get; set; }
    public virtual DbSet<sysdiagram> sysdiagrams { get; set; }
    public virtual DbSet<Territory> Territories { get; set; }
    public virtual DbSet<Alphabetical_list_of_product> Alphabetical_list_of_products { get; set; }
    public virtual DbSet<Category_Sales_for_1997> Category_Sales_for_1997 { get; set; }
    public virtual DbSet<Current_Product_List> Current_Product_Lists { get; set; }
    public virtual DbSet<Customer_and_Suppliers_by_City> Customer_and_Suppliers_by_Cities { get; set; }
    public virtual DbSet<Invoice> Invoices { get; set; }
    public virtual DbSet<Order_Details_Extended> Order_Details_Extendeds { get; set; }
    public virtual DbSet<Order_Subtotal> Order_Subtotals { get; set; }
    public virtual DbSet<Orders_Qry> Orders_Qries { get; set; }
    public virtual DbSet<Product_Sales_for_1997> Product_Sales_for_1997 { get; set; }
    public virtual DbSet<Products_Above_Average_Price> Products_Above_Average_Prices { get; set; }
    public virtual DbSet<Products_by_Category> Products_by_Categories { get; set; }
    public virtual DbSet<Sales_by_Category> Sales_by_Categories { get; set; }
    public virtual DbSet<Sales_Totals_by_Amount> Sales_Totals_by_Amounts { get; set; }
    public virtual DbSet<Summary_of_Sales_by_Quarter> Summary_of_Sales_by_Quarters { get; set; }
    public virtual DbSet<Summary_of_Sales_by_Year> Summary_of_Sales_by_Years { get; set; }

    public virtual ObjectResult<CustOrderHist_Result> CustOrderHist(string customerID)
    {
    var customerIDParameter = customerID != null ?
    new ObjectParameter("CustomerID", customerID) :
    new ObjectParameter("CustomerID", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CustOrderHist_Result>("CustOrderHist", customerIDParameter);
    }

    public virtual ObjectResult<CustOrdersDetail_Result> CustOrdersDetail(Nullable<int> orderID)
    {
    var orderIDParameter = orderID.HasValue ?
    new ObjectParameter("OrderID", orderID) :
    new ObjectParameter("OrderID", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CustOrdersDetail_Result>("CustOrdersDetail", orderIDParameter);
    }

    public virtual ObjectResult<CustOrdersOrders_Result> CustOrdersOrders(string customerID)
    {
    var customerIDParameter = customerID != null ?
    new ObjectParameter("CustomerID", customerID) :
    new ObjectParameter("CustomerID", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CustOrdersOrders_Result>("CustOrdersOrders", customerIDParameter);
    }

    public virtual ObjectResult<Employee_Sales_by_Country_Result> Employee_Sales_by_Country(Nullable<System.DateTime> beginning_Date, Nullable<System.DateTime> ending_Date)
    {
    var beginning_DateParameter = beginning_Date.HasValue ?
    new ObjectParameter("Beginning_Date", beginning_Date) :
    new ObjectParameter("Beginning_Date", typeof(System.DateTime));

    var ending_DateParameter = ending_Date.HasValue ?
    new ObjectParameter("Ending_Date", ending_Date) :
    new ObjectParameter("Ending_Date", typeof(System.DateTime));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Employee_Sales_by_Country_Result>("Employee_Sales_by_Country", beginning_DateParameter, ending_DateParameter);
    }

    public virtual ObjectResult<Sales_by_Year_Result> Sales_by_Year(Nullable<System.DateTime> beginning_Date, Nullable<System.DateTime> ending_Date)
    {
    var beginning_DateParameter = beginning_Date.HasValue ?
    new ObjectParameter("Beginning_Date", beginning_Date) :
    new ObjectParameter("Beginning_Date", typeof(System.DateTime));

    var ending_DateParameter = ending_Date.HasValue ?
    new ObjectParameter("Ending_Date", ending_Date) :
    new ObjectParameter("Ending_Date", typeof(System.DateTime));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Sales_by_Year_Result>("Sales_by_Year", beginning_DateParameter, ending_DateParameter);
    }

    public virtual ObjectResult<SalesByCategory_Result> SalesByCategory(string categoryName, string ordYear)
    {
    var categoryNameParameter = categoryName != null ?
    new ObjectParameter("CategoryName", categoryName) :
    new ObjectParameter("CategoryName", typeof(string));

    var ordYearParameter = ordYear != null ?
    new ObjectParameter("OrdYear", ordYear) :
    new ObjectParameter("OrdYear", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<SalesByCategory_Result>("SalesByCategory", categoryNameParameter, ordYearParameter);
    }

    public virtual int sp_alterdiagram(string diagramname, Nullable<int> owner_id, Nullable<int> version, byte[] definition)
    {
    var diagramnameParameter = diagramname != null ?
    new ObjectParameter("diagramname", diagramname) :
    new ObjectParameter("diagramname", typeof(string));

    var owner_idParameter = owner_id.HasValue ?
    new ObjectParameter("owner_id", owner_id) :
    new ObjectParameter("owner_id", typeof(int));

    var versionParameter = version.HasValue ?
    new ObjectParameter("version", version) :
    new ObjectParameter("version", typeof(int));

    var definitionParameter = definition != null ?
    new ObjectParameter("definition", definition) :
    new ObjectParameter("definition", typeof(byte[]));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_alterdiagram", diagramnameParameter, owner_idParameter, versionParameter, definitionParameter);
    }

    public virtual int sp_creatediagram(string diagramname, Nullable<int> owner_id, Nullable<int> version, byte[] definition)
    {
    var diagramnameParameter = diagramname != null ?
    new ObjectParameter("diagramname", diagramname) :
    new ObjectParameter("diagramname", typeof(string));

    var owner_idParameter = owner_id.HasValue ?
    new ObjectParameter("owner_id", owner_id) :
    new ObjectParameter("owner_id", typeof(int));

    var versionParameter = version.HasValue ?
    new ObjectParameter("version", version) :
    new ObjectParameter("version", typeof(int));

    var definitionParameter = definition != null ?
    new ObjectParameter("definition", definition) :
    new ObjectParameter("definition", typeof(byte[]));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_creatediagram", diagramnameParameter, owner_idParameter, versionParameter, definitionParameter);
    }

    public virtual int sp_dropdiagram(string diagramname, Nullable<int> owner_id)
    {
    var diagramnameParameter = diagramname != null ?
    new ObjectParameter("diagramname", diagramname) :
    new ObjectParameter("diagramname", typeof(string));

    var owner_idParameter = owner_id.HasValue ?
    new ObjectParameter("owner_id", owner_id) :
    new ObjectParameter("owner_id", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_dropdiagram", diagramnameParameter, owner_idParameter);
    }

    public virtual ObjectResult<sp_helpdiagramdefinition_Result> sp_helpdiagramdefinition(string diagramname, Nullable<int> owner_id)
    {
    var diagramnameParameter = diagramname != null ?
    new ObjectParameter("diagramname", diagramname) :
    new ObjectParameter("diagramname", typeof(string));

    var owner_idParameter = owner_id.HasValue ?
    new ObjectParameter("owner_id", owner_id) :
    new ObjectParameter("owner_id", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<sp_helpdiagramdefinition_Result>("sp_helpdiagramdefinition", diagramnameParameter, owner_idParameter);
    }

    public virtual ObjectResult<sp_helpdiagrams_Result> sp_helpdiagrams(string diagramname, Nullable<int> owner_id)
    {
    var diagramnameParameter = diagramname != null ?
    new ObjectParameter("diagramname", diagramname) :
    new ObjectParameter("diagramname", typeof(string));

    var owner_idParameter = owner_id.HasValue ?
    new ObjectParameter("owner_id", owner_id) :
    new ObjectParameter("owner_id", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<sp_helpdiagrams_Result>("sp_helpdiagrams", diagramnameParameter, owner_idParameter);
    }

    public virtual int sp_renamediagram(string diagramname, Nullable<int> owner_id, string new_diagramname)
    {
    var diagramnameParameter = diagramname != null ?
    new ObjectParameter("diagramname", diagramname) :
    new ObjectParameter("diagramname", typeof(string));

    var owner_idParameter = owner_id.HasValue ?
    new ObjectParameter("owner_id", owner_id) :
    new ObjectParameter("owner_id", typeof(int));

    var new_diagramnameParameter = new_diagramname != null ?
    new ObjectParameter("new_diagramname", new_diagramname) :
    new ObjectParameter("new_diagramname", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_renamediagram", diagramnameParameter, owner_idParameter, new_diagramnameParameter);
    }

    public virtual int sp_upgraddiagrams()
    {
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_upgraddiagrams");
    }

    public virtual ObjectResult<Ten_Most_Expensive_Products_Result> Ten_Most_Expensive_Products()
    {
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Ten_Most_Expensive_Products_Result>("Ten_Most_Expensive_Products");
    }

    public override int SaveChanges()
    {
    return base.SaveChanges();
    }
    }
    }

    using System;
    namespace Repository_Database
    {
    public interface INorthwind_DBEntities
    {
    System.Data.Entity.DbSet<Alphabetical_list_of_product> Alphabetical_list_of_products { get; set; }
    System.Data.Entity.DbSet<Category> Categories { get; set; }
    System.Data.Entity.DbSet<Category_Sales_for_1997> Category_Sales_for_1997 { get; set; }
    System.Data.Entity.DbSet<Current_Product_List> Current_Product_Lists { get; set; }
    System.Data.Entity.DbSet<Customer_and_Suppliers_by_City> Customer_and_Suppliers_by_Cities { get; set; }
    System.Data.Entity.DbSet<CustomerDemographic> CustomerDemographics { get; set; }
    System.Data.Entity.DbSet<Customer> Customers { get; set; }
    System.Data.Entity.Core.Objects.ObjectResult<CustOrderHist_Result> CustOrderHist(string customerID);
    System.Data.Entity.Core.Objects.ObjectResult<CustOrdersDetail_Result> CustOrdersDetail(int? orderID);
    System.Data.Entity.Core.Objects.ObjectResult<CustOrdersOrders_Result> CustOrdersOrders(string customerID);
    System.Data.Entity.Core.Objects.ObjectResult<Employee_Sales_by_Country_Result> Employee_Sales_by_Country(DateTime? beginning_Date, DateTime? ending_Date);
    System.Data.Entity.DbSet<Employee> Employees { get; set; }
    System.Data.Entity.DbSet<Invoice> Invoices { get; set; }
    System.Data.Entity.DbSet<Order_Detail> Order_Details { get; set; }
    System.Data.Entity.DbSet<Order_Details_Extended> Order_Details_Extendeds { get; set; }
    System.Data.Entity.DbSet<Order_Subtotal> Order_Subtotals { get; set; }
    System.Data.Entity.DbSet<Order> Orders { get; set; }
    System.Data.Entity.DbSet<Orders_Qry> Orders_Qries { get; set; }
    System.Data.Entity.DbSet<Product_Sales_for_1997> Product_Sales_for_1997 { get; set; }
    System.Data.Entity.DbSet<Product> Products { get; set; }
    System.Data.Entity.DbSet<Products_Above_Average_Price> Products_Above_Average_Prices { get; set; }
    System.Data.Entity.DbSet<Products_by_Category> Products_by_Categories { get; set; }
    System.Data.Entity.DbSet<Region> Regions { get; set; }
    System.Data.Entity.DbSet<Sales_by_Category> Sales_by_Categories { get; set; }
    System.Data.Entity.Core.Objects.ObjectResult<Sales_by_Year_Result> Sales_by_Year(DateTime? beginning_Date, DateTime? ending_Date);
    System.Data.Entity.DbSet<Sales_Totals_by_Amount> Sales_Totals_by_Amounts { get; set; }
    System.Data.Entity.Core.Objects.ObjectResult<SalesByCategory_Result> SalesByCategory(string categoryName, string ordYear);
    int SaveChanges();
    System.Data.Entity.DbSet<Shipper> Shippers { get; set; }
    int sp_alterdiagram(string diagramname, int? owner_id, int? version, byte[] definition);
    int sp_creatediagram(string diagramname, int? owner_id, int? version, byte[] definition);
    int sp_dropdiagram(string diagramname, int? owner_id);
    System.Data.Entity.Core.Objects.ObjectResult<sp_helpdiagramdefinition_Result> sp_helpdiagramdefinition(string diagramname, int? owner_id);
    System.Data.Entity.Core.Objects.ObjectResult<sp_helpdiagrams_Result> sp_helpdiagrams(string diagramname, int? owner_id);
    int sp_renamediagram(string diagramname, int? owner_id, string new_diagramname);
    int sp_upgraddiagrams();
    System.Data.Entity.DbSet<Summary_of_Sales_by_Quarter> Summary_of_Sales_by_Quarters { get; set; }
    System.Data.Entity.DbSet<Summary_of_Sales_by_Year> Summary_of_Sales_by_Years { get; set; }
    System.Data.Entity.DbSet<Supplier> Suppliers { get; set; }
    System.Data.Entity.DbSet<sysdiagram> sysdiagrams { get; set; }
    System.Data.Entity.Core.Objects.ObjectResult<Ten_Most_Expensive_Products_Result> Ten_Most_Expensive_Products();
    System.Data.Entity.DbSet<Territory> Territories { get; set; }
    }
    }

    but when update model from DB i have again add interface to Model so how i reduce this manually work.

    and Unit of work also

    Thanks

    Dharmesh




    Thursday, September 6, 2018 7:11 PM

All replies

  • User475983607 posted

    Look into using T4 templates for code generation as that's what DB first uses. 

    https://docs.microsoft.com/en-us/visualstudio/modeling/code-generation-and-t4-text-templates?view=vs-2017

    Or simply use Code First.  Scaffold to the DB as shown in the reference docs then use migrations from that point on. 

    https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/existing-database

    Thursday, September 6, 2018 7:22 PM
  • User1120430333 posted

    I use the DAO pattern with EF DB first with DI using Unity IoC and WebAPI controller.

    https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm

    Imports System.Web.Http
    Imports DAL
    Imports Entities
    
    Namespace Controllers
    
        <CustomExceptionFilter>
        Public Class TaskController
            Inherits ApiController
    
            Private ReadOnly _daotask As IDaoTask
    
            public sub New (daotask As IDaoTask)
                _daotask = daotask
            End sub
    
            <HttpGet>
            <ActionName("GetTaskById")>
            public Function  GetTaskById(ByVal id As int32) as DtoTask
                return _daotask.GetTaskById(id)
            End Function
            
            <HttpGet>
            <ActionName("GetTasksByProjectId")>
            public  Function GetTasksByProjectId(byval id as int32) as List(Of DtoTask)
                return _daotask.GetTasksByProjectId(id)
            End Function
    
            <HttpPost>
            <ActionName("CreateTask")>
            public sub  CreateTask(ByVal dto As DtoTask)
                Call _daotask.CreateTask(dto)
            End sub
           
            <HttpPost>
            <ActionName("UpdateTask")>
            public sub  UpdateTask(ByVal dto As DtoTask)
                Call _daotask.UpdateTask(dto)
            End sub
            
            <HttpPost>
            <ActionName("DeleteTask")>
            public sub  DeleteTask(byval dto As DtoId)
                Call _daotask.DeleteTask(dto.Id)
            End sub
            
        End Class
    End Namespace
    Imports Entities
    
    Public Interface IDaoTask
    
        Function GetTaskById(ByVal id As int32) As DtoTask
        Function GetTasksByProjectId(byval id as int32) As List(Of DtoTask)
        sub  CreateTask(ByVal dto As DtoTask)
        sub UpdateTask(byval dto As DtoTask)
        sub DeleteTask(ByVal id As Int32)
    
    End Interface
    
    ====================================================================
    
    Imports System.Data.Entity
    Imports Entities
    
    Public Class DaoTask
        Implements IDaoTask
    
        public Function GetTaskById(ByVal id As int32) As DtoTask Implements IDaoTask.GetTaskById
    
            Dim dto = new DtoTask()
    
            Using context As New ProjectManagementEntities
    
                Dim task = (context.Tasks.Where(Function(a) a.TaskId = id)).SingleOrDefault()
    
                If IsNothing(task) Then
                    Return dto
                End If
    
                dto.TaskId = task.TaskId
                dto.TaskName = task.TaskName
                dto.Note = task.Note
                dto.StartDate = task.StartDate
                dto.EndDate = task.EndDate
                dto.ResourceId = task.ResourceId
                dto.ProjectId = task.ProjectId
                dto.TaskDuration = task.TaskDuration
                dto.TaskSpent = task.TaskSpent
                dto.Status = task.Status
        
            End Using
    
            Return dto
    
        End Function
    
        public Function  GetTasksByProjectId(byval id as int32) As List(Of DtoTask) Implements IDaoTask.GetTasksByProjectId
    
            Dim dtos = new List(Of DtoTask)
    
            Using context As New ProjectManagementEntities
                dim tasks = (from a in context.Tasks.Where(Function(a) a.ProjectId = id) select a).ToList()
    
                for each task As Task In tasks
    
                    Dim dto = New DtoTask() With{.TaskId = task.TaskId,
                                                 .TaskName = task.TaskName,
                                                 .Note = task.Note,
                                                 .StartDate = task.StartDate,
                                                 .EndDate = task.EndDate,
                                                 .ResourceId = task.ResourceId,
                                                 .ProjectId = task.ProjectId,   
    .TaskDuration = task.TaskDuration, .TaskSpent = task.TaskSpent, . Status = task.Status} dtos.Add(dto) Next End Using Return dtos End Function public sub CreateTask(ByVal dto As DtoTask) Implements IDaoTask.CreateTask Using context As New ProjectManagementEntities Dim task as New Task() With {.TaskId = dto.TaskId, .TaskName = dto.TaskName, .Note = dto.Note, .StartDate = dto.StartDate, .EndDate = dto.EndDate, .ResourceId = dto.ResourceId, .ProjectId = dto.ProjectId, .TaskDuration = dto.TaskDuration, .TaskSpent = dto.TaskSpent, .Status = dto.Status} context.Tasks.Add(task) context.SaveChanges() End Using End sub public sub UpdateTask(byval dto As DtoTask) Implements IDaoTask.UpdateTask Dim task = new Task() Using context As New ProjectManagementEntities task = (context.Tasks.Where(Function(a) a.TaskId = dto.TaskId)).SingleOrDefault() If Not IsNothing(task) Then task.TaskId = dto.TaskId task.TaskName = dto.TaskName task.Note = dto.Note task.StartDate = dto.StartDate task.EndDate = dto.EndDate task.ResourceId = dto.ResourceId task.ProjectId = dto.ProjectId task.TaskDuration = dto.TaskDuration task.TaskSpent = dto.TaskSpent task.Status = dto.Status End If End Using Using dbcontext As New ProjectManagementEntities If IsNothing(task) Then Exit Sub End If dbcontext.Entry(task).State = EntityState.Modified dbcontext.SaveChanges() End Using End sub public sub DeleteTask(ByVal id As Int32) Implements IDaoTask.DeleteTask Dim task As Task Using context As New ProjectManagementEntities task = (context.Tasks.Where(Function(a)a.TaskId = id)).SingleOrDefault() End Using Using newContext As New ProjectManagementEntities newContext.Entry(task).State = EntityState.Deleted newContext.SaveChanges() End Using End Sub End Class
    Imports System.Web.Http
    Imports Unity
    Imports DAL
    
    
    Public Module WebApiConfig
        Public Sub Register(ByVal config As HttpConfiguration)
            ' Web API configuration and services
    
            dim container = new UnityContainer()
            container.RegisterType(Of IDaoProject, DaoProject) ()
            container.RegisterType(Of IDaoTask, DaoTask) ()
            container.RegisterType(Of IDaoCache, DaoCache) ()
            config.DependencyResolver = new UnityResolver(container)
    
            ' Web API routes
            config.MapHttpAttributeRoutes()
    
            config.Routes.MapHttpRoute(
                name:="DefaultApi",
                routeTemplate:="api/{controller}/{action}/{id}",
                defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}
            )
        End Sub
    
        
    End Module
    

    Friday, September 7, 2018 2:12 AM
  • User-171003712 posted

    Dear DA924,

    As already in my post if We are using any IoC , in my case like Autofac then why we create object of DBCONTEXT as in your post. I dont want to create object so this object is handle Autofac and register with Context with IdbContext

    Using context As New ProjectManagementEntities



    My Code Sample to handle 

    var
     builder = new ContainerBuilder();            builder.RegisterType<B2CEntities>().As<IDbContext>().InstancePerLifetimeScope();

    so there is my one problem arise here i have to handle IDbContext and inherit every time when my model is update.

    Thanks
    Dharmesh
    Saturday, September 8, 2018 4:35 AM
  • User1120430333 posted

    Dear DA924,

    As already in my post if We are using any IoC , in my case like Autofac then why we create object of DBCONTEXT as in your post. I dont want to create object so this object is handle Autofac and register with Context with IdbContext

    Using context As New ProjectManagementEntities
    
    
    

    My Code Sample to handle 

    var
     builder = new ContainerBuilder();            builder.RegisterType<B2CEntities>().As<IDbContext>().InstancePerLifetimeScope();

    so there is my one problem arise here i have to handle IDbContext and inherit every time when my model is update.

    Thanks
    Dharmesh

    Now, Dbcontext is being DI-ed into the DaoProject object using Unity IoC and EF DB first.

    Imports System.Data.Entity
    Imports System.Web.Http
    Imports Unity
    Imports DAL
    Imports Unity.Lifetime
    
    
    Public Module WebApiConfig
        Public Sub Register(ByVal config As HttpConfiguration)
            ' Web API configuration and services
    
            dim container = new UnityContainer()
            container.RegisterType(Of IDaoProject, DaoProject) ()
            container.RegisterType(Of IDaoTask, DaoTask) ()
            container.RegisterType(Of IDaoCache, DaoCache) ()
            container.RegisterType(Of DbContext, ProjectManagementEntities)(new HierarchicalLifetimeManager())
            config.DependencyResolver = new UnityResolver(container)
    
            ' Web API routes
            config.MapHttpAttributeRoutes()
    
            config.Routes.MapHttpRoute(
                name:="DefaultApi",
                routeTemplate:="api/{controller}/{action}/{id}",
                defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}
            )
        End Sub
    
        
    End Module
    
    Imports System.Data.Entity
    Imports Entities
    
    Public Class DaoProject
        Implements IDaoProject
    
        Private ReadOnly context As ProjectManagementEntities
    
        public sub New (dbcontext As ProjectManagementEntities)
            context = dbcontext
        End sub
    
        Public Function GetProjectById(ByVal id As Int32) As DtoProject Implements IDaoProject.GetProjectById
    
            Dim dto = New DtoProject()
       
            Dim project = (context.Projects.Where(Function(a) a.ProjectId = id)).SingleOrDefault()
    
            If IsNothing(project) Then
                Return dto
            End If
    
            dto.ProjectId = project.ProjectId
            dto.ClientName = project.ClientName
            dto.ProjectName = project.ProjectName
            dto.Technology = project.Technology
            dto.ProjectType = project.ProjectType
            dto.UserId = project.UserId
            dto.StartDate = project.StartDate
            dto.EndDate = project.EndDate
            dto.Cost = project.Cost
    
            Return dto
    
        End Function
    
        Public Function GetProjectsByUserId(ByVal userid As String) As List(Of DtoProject) Implements IDaoProject.GetProjectsByUserId
    
            Dim dtos = New List(Of DtoProject)
    
            dtos = (From a In context.Projects.Where(Function(a) a.UserId.Contains(userid))
                    Select New DtoProject With {.ProjectId = a.ProjectId,
                                                .ClientName = a.ClientName,
                                                .ProjectName = a.ProjectName,
                                                .Technology = a.Technology,
                                                .ProjectType = a.ProjectType,
                                                .UserId = a.UserId,
                                                .StartDate = a.StartDate,
                                                .EndDate = a.EndDate,
                                                .Cost = a.Cost}).ToList()
           
    
            Return dtos
    
        End Function
    
        Public Sub CreateProject(ByVal dto As DtoProject) Implements IDaoProject.CreateProject
    
            Dim project = New Project() With {.ClientName = dto.ClientName,
                                                .ProjectName = dto.ProjectName,
                                                .Technology = dto.Technology,
                                                .ProjectType = dto.ProjectType,
                                                .UserId = dto.UserId,
                                                .StartDate = dto.StartDate,
                                                .EndDate = dto.EndDate,
                                                .Cost = dto.Cost}
            context.Projects.Add(project)
            context.SaveChanges()
    
           
        End Sub
    
        Public Sub UpdateProject(ByVal dto As DtoProject) Implements IDaoProject.UpdateProject
    
            Dim project = New Project()
           
            project = (context.Projects.Where(Function(a) a.ProjectId = dto.ProjectId)).SingleOrDefault()
           
            If Not IsNothing(project) Then
                project.ClientName = dto.ClientName
                project.ProjectName = dto.ProjectName
                project.Technology = dto.Technology
                project.ProjectType = dto.ProjectType
                project.UserId = dto.UserId
                project.StartDate = dto.StartDate
                project.EndDate = dto.EndDate
                project.Cost = dto.Cost
            End If
    
          
            If IsNothing(project) Then
                Exit Sub
            End If
    
            context.Entry(project).State = EntityState.Modified
            context.SaveChanges()
           
        End Sub
    
        Public Sub DeleteProject(ByVal id As Int32) Implements IDaoProject.DeleteProject
    
            Dim project As Project
            
            project = (context.Projects.Where(Function(a) a.ProjectId = id)).Include("Tasks").SingleOrDefault()
           
            If IsNothing(project) Then
                Exit Sub
            End If
    
            For i As Integer = 0 To  project.Tasks.Count - 1
                Dim task = project.Tasks(i)
                context.Entry(task).State = EntityState.Deleted
            Next
            
            context.Entry(project).State = EntityState.Deleted
            context.SaveChanges()
           
        End Sub
    
        End Class
    

    Saturday, September 8, 2018 3:47 PM
  • User-171003712 posted

    Dear DA924, 

    Your code working fine. but you removed Interface and add used as direclty used and inject in the repository .

    which is not solve my problem to remove Interface.

    using System;
    namespace Repository_Database
    {
      public  interface INorthwind_DBEntities
        {
            System.Data.Entity.DbSet<Alphabetical_list_of_product> Alphabetical_list_of_products { get; set; }
            System.Data.Entity.DbSet<Category> Categories { get; set; }
            System.Data.Entity.DbSet<Category_Sales_for_1997> Category_Sales_for_1997 { get; set; }
            System.Data.Entity.DbSet<Current_Product_List> Current_Product_Lists { get; set; }
            System.Data.Entity.DbSet<Customer_and_Suppliers_by_City> Customer_and_Suppliers_by_Cities { get; set; }
            System.Data.Entity.DbSet<CustomerDemographic> CustomerDemographics { get; set; }
            System.Data.Entity.DbSet<Customer> Customers { get; set; }
            System.Data.Entity.Core.Objects.ObjectResult<CustOrderHist_Result> CustOrderHist(string customerID);
            System.Data.Entity.Core.Objects.ObjectResult<CustOrdersDetail_Result> CustOrdersDetail(int? orderID);
            System.Data.Entity.Core.Objects.ObjectResult<CustOrdersOrders_Result> CustOrdersOrders(string customerID);
            System.Data.Entity.Core.Objects.ObjectResult<Employee_Sales_by_Country_Result> Employee_Sales_by_Country(DateTime? beginning_Date, DateTime? ending_Date);
            System.Data.Entity.DbSet<Employee> Employees { get; set; }
            System.Data.Entity.DbSet<Invoice> Invoices { get; set; }
            System.Data.Entity.DbSet<Order_Detail> Order_Details { get; set; }
            System.Data.Entity.DbSet<Order_Details_Extended> Order_Details_Extendeds { get; set; }
            System.Data.Entity.DbSet<Order_Subtotal> Order_Subtotals { get; set; }
            System.Data.Entity.DbSet<Order> Orders { get; set; }
            System.Data.Entity.DbSet<Orders_Qry> Orders_Qries { get; set; }
            System.Data.Entity.DbSet<Product_Sales_for_1997> Product_Sales_for_1997 { get; set; }
            System.Data.Entity.DbSet<Product> Products { get; set; }
            System.Data.Entity.DbSet<Products_Above_Average_Price> Products_Above_Average_Prices { get; set; }
            System.Data.Entity.DbSet<Products_by_Category> Products_by_Categories { get; set; }
            System.Data.Entity.DbSet<Region> Regions { get; set; }
            System.Data.Entity.DbSet<Sales_by_Category> Sales_by_Categories { get; set; }
            System.Data.Entity.Core.Objects.ObjectResult<Sales_by_Year_Result> Sales_by_Year(DateTime? beginning_Date, DateTime? ending_Date);
            System.Data.Entity.DbSet<Sales_Totals_by_Amount> Sales_Totals_by_Amounts { get; set; }
            System.Data.Entity.Core.Objects.ObjectResult<SalesByCategory_Result> SalesByCategory(string categoryName, string ordYear);
            int SaveChanges();
            System.Data.Entity.DbSet<Shipper> Shippers { get; set; }
            int sp_alterdiagram(string diagramname, int? owner_id, int? version, byte[] definition);
            int sp_creatediagram(string diagramname, int? owner_id, int? version, byte[] definition);
            int sp_dropdiagram(string diagramname, int? owner_id);
            System.Data.Entity.Core.Objects.ObjectResult<sp_helpdiagramdefinition_Result> sp_helpdiagramdefinition(string diagramname, int? owner_id);
            System.Data.Entity.Core.Objects.ObjectResult<sp_helpdiagrams_Result> sp_helpdiagrams(string diagramname, int? owner_id);
            int sp_renamediagram(string diagramname, int? owner_id, string new_diagramname);
            int sp_upgraddiagrams();
            System.Data.Entity.DbSet<Summary_of_Sales_by_Quarter> Summary_of_Sales_by_Quarters { get; set; }
            System.Data.Entity.DbSet<Summary_of_Sales_by_Year> Summary_of_Sales_by_Years { get; set; }
            System.Data.Entity.DbSet<Supplier> Suppliers { get; set; }
            System.Data.Entity.DbSet<sysdiagram> sysdiagrams { get; set; }
            System.Data.Entity.Core.Objects.ObjectResult<Ten_Most_Expensive_Products_Result> Ten_Most_Expensive_Products();
            System.Data.Entity.DbSet<Territory> Territories { get; set; }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Repository_Database;
    
    namespace RepositoryPattern_RepoInterfaces
    {
        public interface ICustomerRepository
        {
            IEnumerable<Customer> SelectAll();
            Customer SelectByID(string id);
            void Insert(Customer obj);
            void Delete(string id);
            void Save();
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.Entity;
    using RepositoryPattern_RepoInterfaces;
    using Repository_Database;
    
    namespace RepositoryPattern_RepoClasses
    {
    
        public class CustomerRepository : ICustomerRepository
        {
            INorthwind_DBEntities NorthwindContext;
            public CustomerRepository(INorthwind_DBEntities db)
            {
                NorthwindContext = db;
            }
            public IEnumerable<Customer> SelectAll()
            {
             return NorthwindContext.Customers.ToList();
            }
    
            public Customer SelectByID(string id)
            {
            return NorthwindContext.Customers.Find(id);
            }
    
            public void Insert(Customer obj)
            {
                NorthwindContext.Customers.Add(obj);
            }
            public void Delete(string id)
            {
                var value = NorthwindContext.Customers.Where(i => i.CustomerID == id).FirstOrDefault();
                NorthwindContext.Customers.Remove(value);
            }
            public void Save()
            {
                NorthwindContext.SaveChanges();
            }
        }
    }
    
    using Autofac;
    using Autofac.Integration.Mvc;
    using Repository_Database;
    using RepositoryPattern.Controllers;
    using RepositoryPattern_RepoClasses;
    using RepositoryPattern_RepoInterfaces;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace RepositoryPattern.App_Start
    {
        public static class AutofacConfig
        {
            public static void RegisterComponents()
            {
                var builder = new ContainerBuilder();
                builder.RegisterType<CustomerRepository>().As<ICustomerRepository>();
                builder.RegisterType<CustomerController>();
                builder.RegisterType<Northwind_DBEntities>().As<INorthwind_DBEntities>();
                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            }
    
        }
    }

    so problem is present. may be another solution .

    but this is not a accepted answer.

    Thanks DA924

    Saturday, September 8, 2018 4:35 PM
  • User1120430333 posted

    Your code working fine. but you removed Interface and add used as direclty used and inject in the repository .
    which is not solve my problem to remove Interface.

    There is no interface being used for Dbcontext with EF6 DB first that I am using.  I just told Unity to associate the Dbcontext to  ProjectManagementEntities, becuase after all, ProjectManagementEntities is derived from DBContext.  

    All I did was looked at what Unity was doing for Dbcontext for the Identity EF code first usage of Identity up at the MVC5 presentation layer and moved it to the Unity that is being used in the WebAPI that is using Unity,  where EF6 DB first Dbcontext is being used, saying to myself "is this going to work?", and it worked! :) 

    All IoC(s) are not created equal. I found that out the hard way when I discovered Ninject couldn't do the DI needed for using ASP.NET Identity in making it work with the MVC controllers that were using Identity for MVC5, becuase all the other controllers were using DI and Unity.

    Maybe, you should switch to Unity, becuase what you are showing me if you are using EF6 DB first with Dbcontext, I am sure as heck not doing all of that nor do I have any code that looks like what you are showing. 

    Imports System.Data.Entity
    Imports Microsoft.AspNet.Identity
    Imports Microsoft.AspNet.Identity.EntityFramework
    Imports ProgMgmntVB.Controllers
    Imports ProgMgmntVB.Models
    Imports ProgMgmntVB.WebApi
    Imports Unity
    Imports Unity.Injection
    Imports Unity.Lifetime
    Imports Unity.Mvc5
    
    Module ModuleUnity
    
        public class UnityConfig
    
            public shared sub RegisterComponents()
    
                dim container = new UnityContainer()
    
                container.RegisterType(Of IProjectModel, ProjectModel)() 
                container.RegisterType(Of ITaskModel, TaskModel)()
                container.RegisterType(Of IWebApi, WebApi.WebApi)()
                container.RegisterType(Of IModelHelper, ModelHelper)()
    
                'Idenity 
    
                container.RegisterType(Of DbContext, ApplicationDbContext)(new HierarchicalLifetimeManager())
                container.RegisterType(of UserManager(of ApplicationUser))(new HierarchicalLifetimeManager())
                container.RegisterType(of IUserStore(of ApplicationUser), UserStore(of ApplicationUser))(New HierarchicalLifetimeManager())
                container.RegisterType(of AccountController)(new InjectionConstructor())
    
                DependencyResolver.SetResolver(new UnityDependencyResolver(container))
    
            End sub
        
        End Class
    End Module
    
    using System.Data;
    using System.Data.Common;
    using System.Web;
    using System.Web.Mvc;
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using Microsoft.Practices.Unity;
    using Unity.Mvc5;
    using ServiceLayer;
    using WebAPI.Controllers;
    using MVC.Models;
    
    
    namespace MVC.App_Start
    {
        public static class IocExtensions
        {
            public static void BindInRequestScope<T1, T2>(this IUnityContainer container) where T2 : T1
            {
                container.RegisterType<T1, T2>(new HierarchicalLifetimeManager());
            }
    
            public static void BindInSingletonScope<T1, T2>(this IUnityContainer container) where T2 : T1
            {
                container.RegisterType<T1, T2>(new ContainerControlledLifetimeManager());
            }
        }
    
        public class UnityMVC5
        {
            public static void Start()
            {
                var container = BuildUnityContainer();
                DependencyResolver.SetResolver(new UnityDependencyResolver(container));
            }
    
            private static IUnityContainer BuildUnityContainer()
            {
                var container = new UnityContainer();
    
                //Models
                container.BindInRequestScope<IStudentModels, StudentModels>();
                container.BindInRequestScope<IEnrollmentModels, EnrollmentModels>();
    
                //SeviceLayer
                container.BindInRequestScope<IServiceA, ServiceA>();
    
                //WebAPI controllers
                container.BindInRequestScope<IStudentControllerAPI, StudentController>();
                container.BindInRequestScope<IEnrollmentControllerAPI, EnrollmentController>();
    
                //asp.net idenity
    
                container.RegisterType<ApplicationDbContext>();
                container.RegisterType<ApplicationSignInManager>();
                container.RegisterType<ApplicationUserManager>();
                container.RegisterType<IAuthenticationManager>(
                                 new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));
                container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
                            new InjectionConstructor(typeof(ApplicationDbContext)));
    
                return container;
            }
        }
    }

    Saturday, September 8, 2018 7:03 PM