LINQ2SQL DataLayer / Repository建议

时间:2010-04-13 13:51:53

标签: c# linq-to-sql

我当前的存储库如下,请提示,我目前正在使用每次插入/删除/更新的LINQ2SQL数据上下文

namespace Lib.Repository
{

    public class MotorRenewalDataRepository
    {
        public MotorRenewalDataRepository()         
        {

        }
        public MotorRenewalData GetByID(long id)
        {
            using(var _context=DatabaseFactory.Create(false))
            {
                return _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == id).FirstOrDefault();
            }
        }
        public MotorRenewalData Insert(MotorRenewalData entity)
        {
            using (var _context = DatabaseFactory.Create(false))
            {
                _context.MotorRenewalDatas.InsertOnSubmit(entity);
                _context.SubmitChanges();
                return entity;
            }
        }
        public void Update(MotorRenewalData entity)
        {
            using (var _context = DatabaseFactory.Create(true))
            {
                var dbEntity = _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == entity.MotorRenewalDataID)
                            .FirstOrDefault();                
                Common.CopyObject<MotorRenewalData>(entity, dbEntity);
                _context.SubmitChanges();

            }

        }

    }
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您正在寻找有关如何正确实施存储库模式的建议。以下是使用存储库模式的一种很好的做法。首先,您需要为存储库创建一个接口。您可以在此定义存储库可以执行的操作。

public interface IRepository<T>
{
    void Add(T entity);
    void Delete(T entity);
    void Save();
    IQueryable<T> FindAll();
}

接下来,您可以创建单个存储库。您要做的第一件事是为您可能正在执行的普通存储库之外的任何内容创建接口。

public interface IMotorRenewalRepository : IRepository<MotorRenewal>
{
    MotorRenewal FindMotorRenewalById(int id);
}

该接口将实现MotorRenewal的IRepository,以便您从IRepository和IMotorRenewalRepository中定义的所有内容中获取所有内容。当您在为存储库编写假对象和单元测试时使用某种依赖注入时,最常使用该接口。

现在编写您的MotorRenewalRepository并实现IMotorRenewalRepository。

public class MotorRenewalRepository : IMotorRenewalRepository
{
    MyDataContext _dataContext = new MyDataContext();

    public void Add(MotorRenewal motorRenewal)
    {
        _dataContext.MotorRenewals.InsertOnSubmit(motorRenewal);
    }

    public void Delete(MotorRenewal motorRenewal)
    {
        _dataContext.MotorRenewals.DeleteOnSubmit(motorRenewal);
    }

    public void Save()
    {
        _dataContext.SubmitChanges();
    }

    public IQueryable<MotorRenewal> FindAll()
    {
        return _dataContext.MotorRenewals.AsQueryable();
    }

    public User FindMotorRenewalById(int id)
    {
        return _dataContext.MotorRenewals.Where(p => p.MotorRenewalDataID == id).SingleOrDefault();
    }
}

这个实现更容易理解。请注意,您不需要更新。更新实际上只是将MotorRenewal对象从存储库中拉出来,编辑它并调用.Save()。

每次在存储库中调用方法时,都可以为数据上下文使用类级变量,而不是创建新的变量。 MyDataContext应该来自您从数据连接中拖动LinqToSql类时创建的模型。