C# LINQ2SQL数据层/存储库建议
我当前的回复如下,请建议,我当前在每次插入/删除/更新时使用LINQ2SQL数据上下文C# LINQ2SQL数据层/存储库建议,c#,linq-to-sql,C#,Linq To Sql,我当前的回复如下,请建议,我当前在每次插入/删除/更新时使用LINQ2SQL数据上下文 namespace Lib.Repository { public class MotorRenewalDataRepository { public MotorRenewalDataRepository() { } public MotorRenewalData GetByID(long id)
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();
}
}
}
}
如果我正确理解了您的问题,那么您正在寻找关于如何正确实现存储库模式的建议。下面是一个使用存储库模式的良好实践。首先,您需要为存储库创建一个接口。这是定义存储库可以做什么的地方
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获得所有信息,以及在iMotorRenewal存储库中定义的所有信息。在为存储库编写伪对象和单元测试时,当您需要使用某种依赖项注入时,该接口最常用
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();
}
}
现在编写您的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类时创建的模型。@MindlessProgrammer关于swhook关于重用DataContext的建议,请参阅Rick Strahl关于DataContext生存期管理的文章:。我知道我们假设您正在创建一个新的DataContext,但实际上可能正在返回一个缓存实例。如果是这样的话,我只建议将Create方法重命名为Get,以使语义更准确。@swhook@Jay我知道如何创建接口并实现它,我不在乎,我只需要结构化的可用代码。我真正想知道的是DatabaseFactory.CreateuseObjectTracking正在重新启动一个新的datacontext实例,我知道我可以创建一个datacontext并简单地更新实体,然后调用submit changes,通常使用对象跟踪,但此存储库库库由Web服务、Web应用、多线程winform应用共享,我通常会遇到目标跟踪的问题,所以我没有目标跟踪,这是一个好的做法吗?