我是C#和ASP.NET MVC的新手,并且试图了解存储库模式。我已经阅读了很多文章,但是我只是不明白如何使用它。我目前正在使用LINQ to SQL访问我的SQL Server 2005数据库,并且出于测试目的,我创建了两个表。我有一个Employees
表和一个EmployeeContacts
表。两个表的pk是用户名。
雇员
用户名
姓
名字
位置
电子邮件
状态
雇用日期
员工联系方式
用户名
联系人1
联系人1电话
联系1关系
两个表之间存在一对一的关系。可以添加,更新和删除员工,EmployeeContacts
表中的数据也可以添加,更新和删除。
因此,我应该创建一个供两个实体使用的基础存储库,还是应该分别为每个实体创建一个存储库?如果有人愿意给我看一些很棒的代码。
到目前为止,我已经有了这个Employee存储库。我也有一个EmployeeContacts
。
namespace MvcDirectoryLINQ.Models
{
public class EmployeeRepository
{
private TestDB_DataDataContext db = new TestDB_DataDataContext();
private UserName u = new UserName();
//
// Query Methods
public IQueryable<Employee> FindAllEmployees()
{
return db.Employees;
}
public IQueryable<Employee> FindRecentEmployees()
{
DateTime myDate = DateTime.Today.AddMonths(-6);
return from empl in db.Employees
where empl.HireDate >= myDate
orderby empl.HireDate
select empl;
}
public Employee GetEmployee(string UserName)
{
return db.Employees.SingleOrDefault(d => d.UserName == UserName);
}
//
// Insert/Delete Methods
public void Add(Employee employee)
{
// get the UserName which is created from the email
employee.UserName = u.ReturnUserName(employee.Email);
//Insert the new employee into the database
db.Employees.InsertOnSubmit(employee);
db.EmployeeContacts.InsertOnSubmit(employee.EmployeeContact);
}
public void Delete(Employee employee)
{
db.EmployeeContacts.DeleteOnSubmit(employee.EmployeeContact);
db.Employees.DeleteOnSubmit(employee);
}
//
// Persistence
public void Save()
{
db.SubmitChanges();
}
}
}
我有一个EmployeeFormViewModel
的课程:
namespace MvcDirectoryLINQ.Models
{
public class EmployeeFormViewModel
{
//Properties
public Employee Employee { get; private set; }
public EmployeeContact EmployeeContact { get; private set; }
//Constructor
public EmployeeFormViewModel(Employee employee, EmployeeContact employeeContact)
{
Employee = employee;
EmployeeContact = employeeContact;
}
}
}
EmployeeController
的代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(string UserName, FormCollection formValues)
{
Employee employee = employeeRepository.GetEmployee(UserName);
EmployeeContact employeecontact = employeecontactRepository.GetContact(UserName);
try
{
UpdateModel(employee);
UpdateModel(employeecontact);
employeecontactRepository.Save();
employeeRepository.Save();
return RedirectToAction("Details", new { UserName = employee.UserName });
}
catch
{
foreach (var issue in employee.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(new EmployeeFormViewModel(employee, attendingID));
}
}
在我看来,我是从@model MvcDirectoryLINQ.Models.EmployeeFormViewModel
继承的。我的员工数据可以正确保存,但EmployeeContacts无法保存,我也不知道为什么。
我是否正确实现了存储库模式?
参考方案
使用存储库模式(据我所知)的主要目的是使应用程序与特定的数据访问层脱钩。您尚未在此处完成此操作,因为您创建了它,我看到您的EmployeeRepository
类未实现接口。您真的想要像EmployeeRepository : IEmployeeRepository
这样的东西
然后,在Controller代码中,您可以绕过IEmployeeRepository
,而不是与EmployeeRepository
具体一起工作。这将为您带来两个好处:
如果您需要切换后端代码,则只需要制作另一个实现该接口的类即可。
当您去测试控制器时,您可以绕过一个实现接口的所谓的模拟对象,而不是访问实际的数据库,这会降低测试速度并破坏单元测试。
我注意到的另一件事是,您在存储库中旋转了DataContext
。如果您想对多种不同类型的对象进行更改,则将有多个DataContext
打开,我认为这不是您想要的,因为您的更改不会是事务性的。您可能需要研究Unit of Work
模式以寻求解决方案。
在学习模式时,请先弄清楚主要优点,然后再尝试实施。在某些情况下,这可能没有意义。如果您想让我详细说明任何事情,请告诉我。祝好运。
Flask to Dygraph-如何传递数据? - javascript如果我有一个简单的Python时间数据系列,例如:graphdata = [] graphdata.append( [(datetime.date(2008, 5, 7)),75]) graphdata.append([(datetime.date(2008, 5, 8)), 85]) graphdata.append([(datetime.date(200…
LeetCode题解计算机为什么是基于二进制的?可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制
LeetCode题解统计城市的所有灯泡这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…
LeetCode题解黑白圆盘一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可
LeetCode题解圆上任取三点构成锐角三角形的概率来自字节跳动的一道几何题题解:1/4