求助: EF 未将对象引用设置到对象的实例。

_sofn 2015-06-01 06:23:38
求助: 本人对EF不是很熟悉,刚接手了个已经开发的项目,前段时间更更改改都一直很正常,上周五对数据库的一些数据进行标识删除后,测试也没问题,但是今天一来公司登录系统时就不能进入系统了,重新将发布版本更换到周五之前备份的版本也还是存在问题。
后来将程序打开进行调试,系统的登录方法中,会有几次数据库的访问,但是每次进入登录方法后,同一个请求数据库数据的位置,有时候会提示 “未将对象引用设置到对象的实例” 一提示这个错误后就不能逐步调试了,会直接提示错误,重新刷新页面再进入方法,上次提示 “未将对象引用设置到对象的实例” 的又通过了,但是在之后的有数据为请求的地方又会提示 “未将对象引用设置到对象的实例” 。 本人一直以为是数据库连接有问题,但是一直也没有搞定这个问题,请熟悉EF的同仁们帮帮忙,这个问题困扰了我一天了。
以下为我的部分代码,如果有不明白的地方请回复我,谢谢。
 /// <summary>
/// 登录:为零则表示登录成功,小于零则表示错,大于零表示有提示信息
/// </summary>
/// <param name="name"></param>
/// <param name="password"></param>
/// <param name="isPadLogin">是否从IPAD登录请求</param>
/// <param name="loginType">登录类型:0 - 管理中心,1 - 论坛后台,2 - 学院后台</param>
/// <returns></returns>
public static string Login(string name, string password, bool isPadLogin = false, int loginType = 0)
{
var service = ServiceResolver.Resolver.GetService<IBusinessService>().CommonDb(true);
if (loginType == 0 || loginType == 2)
{
password = isPadLogin ? password.ToLower()
: System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower();

var user = exts.Administrators(name, password);
if (user == null)
{
if (isPadLogin)
user = service.Get<UserInfo>(u => u.PadLoginName == name && u.IsDeleted == false);
else
user = service.Get<UserInfo>(u => u.LoginName == name && u.IsDeleted == false);//第一次进入登录方法时,这个位置会有报错
}

// 不存在该用户名
if (user == null) { return "-1"; }
if (!user.IsEnabled) { return "-4"; }

// 密码错误
if (isPadLogin) { if (user.PadLoginPassword.ToLower() != password) return "-2"; }
else { if (user.LoginPassword.ToLower() != password) return "-2"; }

// 密码过期
// if (user.PasswordExpired <= DateTime.Now) return -3;
user.Id = new Guid(user.Id.ToString().ToLower());

// 解决问题:在同步到IPAD端后日期格式为标准的本地格式
var now = DateTime.Now;
user.LastLogin = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, DateTimeKind.Unspecified);

// 验证组织是否有效
var org = service.Get<Organization>(o => o.ID == user.OrganizationID);
if (org == null || !org.IsPublish || org.IsDeleted) return "-5";

service.SaveChanges();

//==============================================================
// 保存用户信息
SetCurrentUser(user);

//==============================================================
// 密码快要过期
// if ((user.PasswordExpired - DateTime.Now).TotalDays <= 3) { return 3; }

return loginType.ToString();
}
else { return "-1"; }
}


 private static void SetCurrentUser(string name)
{
var user = ServiceResolver.Resolver.GetService<IBusinessService>().Common
.Get<UserInfo>(u => u.LoginName == name);

if (user != null) { SetCurrentUser(user); }
else
{
System.Web.Security.FormsAuthentication.SignOut();
HttpContext.Current.Response.Redirect("/Home/Login");
}
}




private static void SetCurrentUser(UserInfo user)
{
//先设置身份认证信息
System.Web.Security.FormsAuthentication.SetAuthCookie(user.LoginName, false);
LoginUser loginUser = new LoginUser();
loginUser = CloneUserToLogin(user);
//加载所有上级
List<Organization> parents = ServiceResolver.Resolver.GetService<IBusinessService>()
.Service<IOrganizationService>()
.GetOrganizationParents(loginUser.OrganizationID);
foreach (var item in parents)
{
loginUser.OrganizationIDList.Add(new Item<string, string, string>() { Key = item.TypeCode.ToString(), Value = item.ID.ToString(), Name = item.Name });
if (item.ID == user.OrganizationID) //保存用户所在组织类型
{
loginUser.OrganizationType = (OrganizationType)item.TypeCode;
}
}
//找到用户所属岗位列表。
loginUser.userJobPosition = GetUserJobPosition(loginUser.Id);

//获取用户岗位名称
if (loginUser.userJobPosition.Any())
{
loginUser.JobPositionName = loginUser.userJobPosition[0].Name;
}
//找到用户所拥有权限列表。

loginUser.JobPositionModel = GetJobPositionFunction(loginUser);
loginUser.userPermissionModule = GetPermissionModule(loginUser);
//获取用户所属组织名称
//loginUser.OrganizationName = ServiceResolver.Resolver.GetService<IBusinessService>().Common.Get<Organization>(c => c.ID == loginUser.OrganizationID).Name;
//上面是原始的代码,后来出现报错后我就进行了判空,但是有时候也还是会在下面获取对象的时候提示错误
Organization o = ServiceResolver.Resolver.GetService<IBusinessService>().Common.Get<Organization>(c => c.ID == loginUser.OrganizationID);
if (o != null)
loginUser.OrganizationName = o.Name;
else
loginUser.OrganizationName = "#####";

//保存用户信息到 Session 内
HttpContext.Current.Session[CurrentUserKey] = loginUser;
}




都是在请求数据库的时候出现这个问题。
请大大们指点一下,谢谢。
...全文
457 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
_sofn 2015-06-04
  • 打赏
  • 举报
回复
问题彻底解决了 本地程序也是因为类库的问题,重新将与获取数据库连接有关系的DLL文件换成未出问题的DLL后就可以了。 接手别人的项目就是不好搞,谁能想到有些类库是自己写的,命名却和框架的一样,直接醉了。 很感谢各位的帮忙。
_sofn 2015-06-03
  • 打赏
  • 举报
回复
这个问题我现在解决了一半 ,是因为生成的DLL文件和pdb文件的问题,可能是由于每次我复制项目的时候,操作不当把引用之间的文件弄坏了。 找到这个原因是因为我将发布文件与之前的一个版本做了比较后有点不一样,我就把我引用的DLL文件都替换成以前的版本下的DLL,然后系统就可以登录了,之后的操作也没有问题。 虽然不是很明白为什么会这样,不过解决了生产机的问题了,现在只要把本地程序搞出来就行了。 谢谢各位
天空丶蒋 2015-06-02
  • 打赏
  • 举报
回复
ServiceResolver.Resolver.GetService<IBusinessService>().Common                 .Get<UserInfo>(u => u.LoginName == name);这个方法在哪?
yue547283947 2015-06-02
  • 打赏
  • 举报
回复
ServiceResolver.Resolver.GetService<IBusinessService>().Common .Get<UserInfo>(u => u.LoginName == name); 方法没取到值。 把方法返回值加null判断
_sofn 2015-06-02
  • 打赏
  • 举报
回复
引用 3 楼 az6161311 的回复:
ServiceResolver.Resolver.GetService<IBusinessService>().Common
                .Get<UserInfo>(u => u.LoginName == name);这个方法在哪?


这个就是这个样子的一个方法,我也是很理解,下面是我把它分开之后展示里面的样子,这个是 DatabaseContext 有值,有时候DatabaseContext没有值为 null
″水瓶 2015-06-01
  • 打赏
  • 举报
回复
luguo!~~~~~~~~~~~~~~
  • 打赏
  • 举报
回复
引用 楼主 qq_27057347 的回复:
都是在请求数据库的时候出现这个问题。 请大大们指点一下,谢谢。
你应该调试出到底是哪一个变量是null。然后如果需要还可以查看调用堆栈,查看方法调用的了流程从哪一层调用的数据就不对了。 而不是猜。

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧