0

我正在尝试使用 LINQ to SQL 数据上下文来实现通用存储库模式。上下文以 NULL 形式出现。为了获得上下文并使其发挥作用,需要进行哪些更改?

我有一个dbml文件,其中包含以下内容:

public partial class LibraryManagementClassesDataContext : System.Data.Linq.DataContext

它有帐户实体

代码

static void Main(string[] args)
{

        RepositoryLayer.Repository<RepositoryLayer.Account> selectedRepository = new RepositoryLayer.Repository<RepositoryLayer.Account>();
        AccountBusiness accountBl = new AccountBusiness(selectedRepository);
        List<RepositoryLayer.Account> accountList =   accountBl.GetAllAccounts();

}


namespace RepositoryLayer
{
public interface IRepository<T> where T : class
{
    System.Linq.IQueryable<T> GetAll();
}

public class Repository<T> : IRepository<T> where T : class
{
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }

    public virtual System.Linq.IQueryable<T> GetAll()
    {
        if (Context == null)
        {
            throw new Exception("Context is null");
        }
        return Context.GetTable<T>();
    }

}
}

public class AccountBusiness
{
    //IRepository<T>
    RepositoryLayer.IRepository<RepositoryLayer.Account> accountRepository;
    public AccountBusiness(RepositoryLayer.IRepository<RepositoryLayer.Account> repo)
    {
        accountRepository = repo;
    }

    public List<RepositoryLayer.Account> GetAllAccounts()
    {
        IQueryable<RepositoryLayer.Account> acc = accountRepository.GetAll();
        return acc.ToList();
    }

}

阅读:

  1. LinqToSql 声明和实例化 DataContext 最佳实践?
4

2 回答 2

1

当然它是空的:你永远不会为你的Context财产赋值。去做就对了:

using(var context = new LibraryManagementClassesDataContext())
{
    RepositoryLayer.Repository<RepositoryLayer.Account> selectedRepository = new RepositoryLayer.Repository<RepositoryLayer.Account>();
    selectedRepository.Context = context;
    AccountBusiness accountBl = new AccountBusiness(selectedRepository);
    List<RepositoryLayer.Account> accountList =   accountBl.GetAllAccounts();
}

我也建议Repository.DataContextLibraryManagementClassesDataContext类型。

于 2012-06-20T06:29:24.657 回答
0

由于尚未实例化上下文,您可以在类构造函数中创建它。像这样的东西...

public class Repository<T> : IRepository<T> where T : class
{
    public Repository()
    {
        this.Context = new System.Data.Linq.DataContext()
    }
}

您还可以使您的上下文保持短暂并尽早处理它。在此处阅读有关尽早处理它的更多信息:在 LINQ-SQL 中,包装 DataContext 是一个 using 语句 - 优点缺点

public virtual System.Linq.IQueryable<T> GetAll()
{
    using (var context == new System.Data.Linq.DataContext())
    {
        return Context.GetTable<T>();
    }
}
于 2012-06-20T06:28:44.560 回答