簡體   English   中英

具有工作單元和通用存儲庫的原始操作

[英]Crud operations with unit of work and generic repository

我正在使用Ninject for DI在帶有unitofwork和通用存儲庫的mvc 4.0中進行粗操作。 我可以從表中獲取特定記錄,甚至可以從表中獲取所有記錄。 但是我無法在數據庫表中插入新記錄。 我沒有收到任何錯誤/異常,它正在干凈地運行每個語句,但是在數據庫中沒有任何作用,下面是我使用存儲庫和unitof工作的控制器。 有人可以告訴我我在哪里或在這段代碼中留下了哪些代碼/聲明。 我已經檢查了很多時間,現在被困住了。 沒有解決問題

控制器:

 private IUnitOfWork _unitOfWork;
    private IRepository<tbl_Employee> _Repo;
    private IRepository<tbl_Department> _Department;

    public HomeController( IUnitOfWork UOW, IRepository<tbl_Employee> Repository, IRepository<tbl_Department> Depart)
    {   
        this._unitOfWork = UOW;
        this._Repo = Repository;
        this._Department = Depart;
    }


       //This runs successfully and gets all the records in the view page and I am displaying all records using foreach in div structure



 public ActionResult Index()
    {
        EmployeeModel ObjModel = new EmployeeModel();
        ObjModel.Employees = this._Repo.GetALL();
        //ObjModel.Employees = this._Employee.GetEmployees();
        return View(ObjModel);
    }

//This also runs successfully and it brought me a single record on selection of particular record from employee listing.



    public ActionResult EmployeeDetail(string id)
            {
                EmployeeDetailModel ObjModel = new EmployeeDetailModel();
                if (!string.IsNullOrEmpty(id))
                {
                    var Employee = this._Repo.Find(Convert.ToInt32(id));
                    if (Employee != null)
                    {
                        ObjModel.InjectFrom(Employee);
                    }
                }
                return View(ObjModel);
            }

// Here is the problem . Not able to insert the record. The model object is not empty . I have checked it and there is no error.It brought me  a message 
  "Employee Created Successfully but in database there is no record.



    public ActionResult SaveEmployee(EmployeeDetailModel Model)
            {
                string Msg = string.Empty;
                try
                {
                    tbl_Employee ObjEmployee = new tbl_Employee();
                    ObjEmployee.InjectFrom(Model);
                    if (Model.Male)
                    {
                        ObjEmployee.Sex = "m";
                    }
                    else
                    {
                        ObjEmployee.Sex = "f";
                    }
                    ObjEmployee.Department_Id = Model.Dept_id;
                    ObjEmployee.Salary = Convert.ToInt32(Model.Salary);
                    this._Repo.Insert(ObjEmployee);
                    this._unitOfWork.Commit();
                    Msg = "Employee Created Successfully";
                }
                catch
                {
                    Msg = "Error occurred while creating the employee, Please try again.";
                }
                return Json(new { Message = Msg });
            }

/// Repository interface



     public interface IRepository<T> where T : class
        {
            void Insert(T entity);
            void Delete(T entity);
            void Update(T entity);
            T Find(int key);
            IEnumerable<T> GetALL();
        }

儲存庫類

 public class Repository<T> : Connection, IRepository<T> where T : class
        {
            private readonly DbSet<T> _dbSet;

            public Repository()
            {
                _dbSet = _dbContext.Set<T>();
            }

            public void Insert(T entity)
            {
                _dbSet.Add(entity);
            }
            public void Delete(T entity)
            {
                _dbSet.Remove(entity);
            }
            public void Update(T entity)
            {
                var updated = _dbSet.Attach(entity);
                _dbContext.Entry(entity).State = EntityState.Modified;
                //_dataContext.Entry(item).State = EntityState.Modified;
            }
            public T Find(int Key)
            {
                var dbResult = _dbSet.Find(Key);
                return dbResult;
            }
            public IEnumerable<T> GetALL()
            {
                return _dbSet;
            }
        }

工作單元界面

  public interface IUnitOfWork : IDisposable
        {
            void Commit();
        }

 Unit of work class

public class UnitOfWork : Connection, IUnitOfWork
    {
        private bool _disposed;
        public void Commit()
        {
            _dbContext.SaveChanges();
        }
        public void Dispose()
        {
            Dispose(true);

            // Take yourself off the Finalization queue to prevent finalization code for object from executing a second time.
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if (!_disposed)
            {
                // If disposing equals true, dispose all managed and unmanaged resources.
                if (disposing)
                {
                    // Dispose managed resources.
                    if (_dbContext != null)
                    {
                        _dbContext.Dispose();
                    }
                }
            }

            _disposed = true;
        }
    }

我的UnitofWork和Repository類從定義dbcontext的連接類派生。

 public abstract class Connection
    {
        protected db_TestEntities _dbContext;
        public Connection()
        {
            this._dbContext = new db_TestEntities();
        }
    }

是我的dbContext每次都在創建一個新實例,就像這里解釋的那樣

如果是的話,我該如何解決。

tbl_Employee ObjEmployee = new tbl_Employee();
ObjEmployee.InjectFrom(Model);
if (Model.Male)
{
    ObjEmployee.Sex = "m";
}
else
{
    ObjEmployee.Sex = "f";
}
ObjEmployee.Department_Id = Model.Dept_id;
ObjEmployee.Salary = Convert.ToInt32(Model.Salary);
this._Repo.Insert(ObjEmployee);

之后,您應該看到EF在本地內存中映射了您的對象。

this._unitOfWork.Commit();

在這里,您的對象應該被推送到數據庫。 dbContext.SaveChanges()返回更改的記錄數,在您的情況下應該為1。

Msg = "Employee Created Successfully";

更新:所以問題出在您建議的Connection類中。

我將在一個地方創建DbContext,然后將其傳遞到存儲庫和工作單元。 您還可以在工作構造器單元中創建DbContext,然后將UOW傳遞到存儲庫。 這是我對此的較早實現:

public class EntityFrameworkUnitOfWork : IUnitOfWork
{
    private ForexDbContext dbContext;

    internal ForexDbContext DbContext
    {
        get { return dbContext ?? (dbContext = new ForexDbContext()); }
    }

    internal DbSet<T> Set<T>()
    where T : class
    {
        return DbContext.Set<T>();
    }

    public void Dispose()
    {
        if(dbContext == null) return;

        dbContext.Dispose();
        dbContext = null;
    }

    public void SaveChanges()
    {
        int result = DbContext.SaveChanges();
    }

    public ITransaction BeginTransaction()
    {
        return new EntityFrameworkTransaction(DbContext.BeginTransaction());
    }
}
public class ContactsRepositoryWithUow : IRepository<Contact>
{
    private SampleDbEntities entities = null;

    public ContactsRepositoryWithUow(SampleDbEntities _entities)
    {
        entities = _entities;
    }

    public IEnumerable<Contact> GetAll(Func<Contact, bool> predicate = null)
    {
        if (predicate != null)
        {
            if (predicate != null)
            {
                return entities.Contacts.Where(predicate);
            }
        }

        return entities.Contacts;
    }

    public Contact Get(Func<Contact, bool> predicate)
    {
        return entities.Contacts.FirstOrDefault(predicate);
    }

    public void Add(Contact entity)
    {
        entities.Contacts.AddObject(entity);
    }

    public void Attach(Contact entity)
    {
        entities.Contacts.Attach(entity);
        entities.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
    }

    public void Delete(Contact entity)
    {
        entities.Contacts.DeleteObject(entity);
    }       
}

請在下面的鏈接中找到答案以獲取更多詳細信息

使用UnitOfWork進行粗體操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM