我試圖將用戶首選項保存到表中,但得到一個空異常,我不明白爲什麼。這是一個MVC 4應用程序,這是我得到錯誤的行爲結果。不能將值NULL插入列錯誤
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值插入列「用戶ID」,表 「WebSiteNew.dbo.RaterPreferences」;列不允許有空值。 INSERT 失敗。\ r \ n聲明已終止。
這是沒有道理的原因是因爲所有三個屬性,包括UserId都有數據,當我通過。這些是表格中唯一的字段。 UserId = 1,RaterId = 6且Count清楚地設置爲1.它們都被設置爲不可爲空的整數,並且主鍵是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
您已使用「Key」屬性在RaterPreferences類上修飾了UserID屬性,該屬性將UserID設置爲RaterPreferences表的主鍵中的唯一列。要配置複合主鍵,您需要像這樣在您的DbContext中設置:http://www.luisrozards/2010/11/creating-composite-keys-using-code.html – 2013-05-07 15:34:31
就是這樣。我將[Key,Column(Order = 1)]添加到了UserId和[Key,Column(Order = 2)]給RaterId並且它工作。感謝您花時間研究這一點。有趣的是,自動生成的會員表webpages_UsersInRole也有一個複合主鍵,並且正是我所建模的(使用單個[Key]),但它工作正常。 – aw04 2013-05-07 15:46:49