2013-05-07 82 views
2

我試圖將用戶首選項保存到表中,但得到一個空異常,我不明白爲什麼。這是一個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 

回答

0

我抄你的代碼到一個全新的ASP.Net MVC項目與實體框架的當前版本,我可以沒有任何問題運行代碼。我逃跑時代碼的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類,並用數據庫優先技術重建它們。

+1

您已使用「Key」屬性在RaterPreferences類上修飾了UserID屬性,該屬性將UserID設置爲RaterPreferences表的主鍵中的唯一列。要配置複合主鍵,您需要像這樣在您的DbContext中設置:http://www.luisrozards/2010/11/creating-composite-keys-using-code.html – 2013-05-07 15:34:31

+0

就是這樣。我將[Key,Column(Order = 1)]添加到了UserId和[Key,Column(Order = 2)]給RaterId並且它工作。感謝您花時間研究這一點。有趣的是,自動生成的會員表webpages_UsersInRole也有一個複合主鍵,並且正是我所建模的(使用單個[Key]),但它工作正常。 – aw04 2013-05-07 15:46:49