我有多个数据库链接到同一个db上下文,我将保存在会话变量中的连接字符串传递给db上下文。为了使应用程序更健壮,我想验证会话变量是否为null。如果它为null,则将用户重定向到登录页面。
我似乎没有找到办法做到这一点。尝试传递连接字符串时,我经常在存储库中遇到错误。它永远不会到达错误处理部分。
我在这里做错了什么?
System.NullReferenceException:未将对象引用设置为对象的实例。
以下是我的代码。
的DbContext:
public class AppContext : DbContext
{
public AppContext()
: base()
{
}
static AppContext()
{
Database.SetInitializer<AppContext>(null);
}
public AppContext(string connectionKey)
: base("Name =" + connectionKey)
{
}
public DbSet<App.Models.Contact> Contacts { get; set; }
}
模型回购:
public class ContactRepository : IContactRepository
{
// Following line generates the error.
AppContext context = new AppContext(Helpers.GetSessionKey("_ConnectionString").ToString());
public IQueryable<Contacts> All
{
get { return context.Contacts; }
}
}
帮手方法:
internal static class Helpers
{
public static object GetSessionKey(string key)
{
if (HttpContext.Current.Session != null)
{
return HttpContext.Current.Session[key];
}
else {
// This never fires.
// Handle the error.
}
}
}
答案 0 :(得分:1)
您绝对不应该与存储库中的HttpContext
进行交互。我很惊讶很久以前没有发生过你的事情。如果你的上下文需要Session
的值,那很好,但是你应该在新的存储库/上下文时传入该值。例如:
public class ContactRepository : IContactRepository
{
private readonly AppContext context;
public ContactRepository(string connectionString)
{
context = new AppContext(connectionString);
}
...
然后,在您的控制器中,您应该使用HttpContext
之类的唯一地方,您可以执行以下操作:
var repo = new ContactRepository(Session["_ConnectionString"] ?? "Default Connection String Here");
这样,请求上下文就不会泄漏到您的数据层中。