我正在尝试将用户首选项保存到表中,但是我得到一个null异常,我不明白为什么。这是一个MVC 4应用程序,这是我的行动结果,我收到错误。
public ActionResult Go(string path, string name)
{
RaterContext r = new RaterContext();
UserData u = new UserData();
var userid = u.GetCurrentUserData().UserId;
var info = r.RatersInfo.Where(w => w.RaterName.Equals(name)).FirstOrDefault();
var pref = r.RatersPreferences.Where(w => w.RaterId.Equals(info.RaterId) && w.UserId.Equals(userid)).FirstOrDefault();
if (pref != null && pref.Count > 0)
{
pref.Count++;
r.SaveChanges();
}
else
{
pref = new RaterPreferences();
pref.UserId = userid;
pref.RaterId = info.RaterId;
pref.Count = 1;
r.RatersPreferences.Add(pref);
r.SaveChanges();
}
return Redirect(path);
}
尚未在首选项表中保存任何内容,因此它正在命中else块并在r.SaveChanges();上抛出一个空异常。
是个例外无法将值NULL插入列'UserId',表中 'WebSiteNew.dbo.RaterPreferences';列不允许空值。插入 失败。\ r \ n声明已经终止。
这没有意义的原因是因为当我单步执行时,包括UserId在内的所有三个属性都有数据。这些是表中的唯一字段。 UserId = 1,RaterId = 6,Count显然设置为1.它们都设置为不可为空的int,主键是UserId和RaterId的组合。我的模型如下。
public class RaterContext : DbContext
{
public RaterContext()
: base("DefaultConnection")
{
}
public DbSet<RaterInfo> RatersInfo { get; set; }
public DbSet<RaterPreferences> RatersPreferences { get; set; }
}
[Table("RaterInfo")]
public class RaterInfo
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int RaterId { get; set; }
public string RaterName { get; set; }
public string RaterLink { get; set; }
public string Section { get; set; }
public string Department { get; set; }
}
[Table("RaterPreferences")]
public class RaterPreferences
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public int RaterId { get; set; }
public int Count { get; set; }
}
任何帮助都会非常感激,因为我对MVC和ASP.NET相对较新。如果您需要更多信息,请与我们联系。提前谢谢!
我不知道这是否有帮助,但我测试通过手动添加数据来查看UPDATE会发生什么,因此它会捕获if块并且可以正常工作。我只是在插入INSERT时出错。
以下是相关表的create语句。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[RaterPreferences](
[UserId] [int] NOT NULL,
[RaterId] [int] NOT NULL,
[Count] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RaterId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[RaterPreferences] WITH CHECK ADD CONSTRAINT [FK_RaterPreferences_RaterInfo] FOREIGN KEY([RaterId])
REFERENCES [dbo].[RaterInfo] ([RaterId])
GO
ALTER TABLE [dbo].[RaterPreferences] CHECK CONSTRAINT [FK_RaterPreferences_RaterInfo]
GO
答案 0 :(得分:0)
我已将您的代码复制到一个全新的ASP.Net MVC项目中,该项目包含当前版本的Entity Framework,我可以毫无问题地运行您的代码。我使用类似以下代码的方式逃过了UserData的获取:
RaterContext r = new RaterContext();
//UserData u = new UserData();
var userid = 1; // u.GetCurrentUserData().UserId;
var info = r.RatersInfo.Where(w => w.RaterName.Equals(name)).FirstOrDefault();
并且在运行此代码的其余部分时没有问题。
我认为您的RaterPreferences表的密钥和数据库结构可能存在一些问题。我不知道你的完整数据模型,但我不明白它是如何适应的,并且它没有按照你描述的方式键入你的代码。
修改强> 我修改了数据库表以反映您描述的设计。您的EntityFramework代码优先实现与数据库之间存在差异。看起来您的数据库首先存在,我将删除您的EntityFramework类并使用Database First技术重建它们。