Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ2SQL数据层/存储库建议_C#_Linq To Sql - Fatal编程技术网

C# 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)

我当前的回复如下,请建议,我当前在每次插入/删除/更新时使用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();

            }

        }

    }
}

如果我正确理解了您的问题,那么您正在寻找关于如何正确实现存储库模式的建议。下面是一个使用存储库模式的良好实践。首先,您需要为存储库创建一个接口。这是定义存储库可以做什么的地方

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应用共享,我通常会遇到目标跟踪的问题,所以我没有目标跟踪,这是一个好的做法吗?