存储库模式和MVC帮助 - c#

我是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