1

我試着去實現使用this Scott Allen tutorial幫助EF代碼第一個連接字符串

我現在SqlUnitOfWork一個的UnitOfWork模式是如下因素

public class SqlUnitOfWork : IUnitOfWork { 

     public SqlUnitOfWork() { 
      var connectionString = 
       ConfigurationManager 
        .ConnectionStrings[ConnectionStringName] 
        .ConnectionString; 

      _context = new ObjectContext(connectionString); 
      _context.ContextOptions.LazyLoadingEnabled = true; 
     } 

     public IRepository<PhysicalTest> PhysicalTests 
     { 
      get { 
       if (_physicalTests == null) 
       { 
        _physicalTests = new SqlRepository<PhysicalTest>(_context); 
       } 
       return _physicalTests; 
      } 
     } 

     public IRepository<EHR> EHRs 
     { 
      get 
      { 
       if (_EHRs == null) 
       { 
        _EHRs = new SqlRepository<EHR>(_context); 
       } 
       return _EHRs; 
      } 
     } 



     public void Commit() { 
      _context.SaveChanges(); 
     } 

     SqlRepository<PhysicalTest> _physicalTests = null; 
     SqlRepository<EHR> _EHRs = null; 

     readonly ObjectContext _context; 
     const string ConnectionStringName = "default"; 
    } 

和我目前的連接字符串是以下

<add name="default" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;MultipleActiveResultSets=True; initial catalog=MyAppDB" providerName="System.Data.SqlClient" /> 

還值得指出的是,我的控制器正在使用由mvcscaffolding創建的控制器正常工作,但工作單元(whi ch由於某種原因需要連接字符串作爲參數而不是僅使用MyAppDBContext()實例)不起作用。

的錯誤,我得到當我嘗試調用與下面的代碼controllr內的行動:

public class PhysicalTestsController : Controller 
    { 
     private IUnitOfWork unitOfWork; 
     private IRepository<EHR> ehrRepository; 


     public PhysicalTestsController(IUnitOfWork unit) 
     { 
      unitOfWork = unit; 
      ehrRepository = unitOfWork.EHRs; 
     } 


     public ActionResult Index(int ehrId, int? page) 
     { 
      EHR ehr = ehrRepository.FindById(ehrId); 
      if (ehr.UserName != User.Identity.Name) 
       return View("Invalid Owner"); 
      const int pageSize = 5; 
      var physicaltests = ehr.PhysicalTests.OrderByDescending(test => test.CreationDate); 
      List<PhysicalTestListItem> physicalTestsVM = new List<PhysicalTestListItem>(); 
      Mapper.Map(physicaltests, physicalTestsVM); 
      var paginatedTests = new PaginatedList<PhysicalTestListItem>(physicalTestsVM, page ?? 0, pageSize); 
      return View(paginatedTests); 
     } 
} 

這是一個

enter image description here

回答

0

我已經改變了我SqlRepository到:

public class SqlRepository<T> : IRepository<T> 
            where T : class, IEntity { 

     internal SummumnetDB context; 
     internal DbSet<T> _objectSet; 

     public SqlRepository(SummumnetDB context) 
     { 
      this.context = context; 
      this._objectSet = context.Set<T>(); 
     } 

..... rest of my methods here 

} 

我SqlUnitofWork到

public class SqlUnitOfWork : IUnitOfWork { 

     private SummumnetDB _context = new SummumnetDB(); 

     public IRepository<PhysicalTest> PhysicalTests 
     { 
      get { 
       if (_physicalTests == null) 
       { 
        _physicalTests = new SqlRepository<PhysicalTest>(_context); 
       } 
       return _physicalTests; 
      } 
     }..... rest of code here 

請糾正我,如果這樣修改是不恰當或打破這些模式之一

-1

您使用ObjectContextDbContextObjectContext使用EntityConnection及其System.Data.EntityClient供應商。它的連接字符串有different format

+0

我很感謝你的回答....你介意看看我提供的答案嗎? ..我只是想找出實現工作單元模式的最佳方法......我想我的問題應該已經更清楚了..即時通訊仍然不確定是否應該保留我在我的問題中提供的代碼,只需更改連接字符串或使用我的答案中的代碼使用DbContext .... – ignaciofuentes