8

出於某種原因,我收到以下錯誤在db.SaveChanges();指令:這是爲什麼拋出NULL值異常?

Cannot insert the value NULL into column 'UserId', table 'XXXXXXXXX_Dev.dbo.Portfolios'; column does not allow nulls. INSERT fails. 
The statement has been terminated. 

控制器代碼:

[HttpPost] 
[Authorize] 
public ActionResult Create(Portfolio portfolio) 
{ 
    if (ModelState.IsValid) 
    { 
     portfolio.UserId = (Guid)Membership.GetUser().ProviderUserKey; 
     db.AddToPortfolios(portfolio); 
     db.SaveChanges(); 
    } 
    return View("MyPortfolios"); 
} 

我已經通過調試加強,並證實正在進行填充用戶名。

更新:

我試圖改變db.AddToPortfolios(portfolio);db.Portfolios.AddObject(portfolio);但它仍然有同樣的問題。我應該使用Attach()方法嗎?

+0

User'd是另一個表的外鍵,還是「Portfolio」表上的主鍵(或者兩者可能是1對1關係)?你真的使用EF 4.1嗎?我想知道,因爲'db'在你的代碼中似乎是一個'ObjectContext'而不是'DbContext'。 – Slauma

+0

你是對的我正在使用版本4而不是4.1。我使用模型第一種方法來創建數據庫。 'UserId'是'Portfolio'的主鍵。 「投資組合」與另一張桌子有多對多的關係。它看起來像實體框架在實際數據庫中創建了一個連接表,以方便多對多。 – ZeroDivide

回答

8

我知道這個例外只有一種情況,那就是:UserId不是數據庫中的標識列,而是在EF模型中相應的屬性被標記爲 - 這意味着它明確歸因於DatabaseGeneratedOption.Identity或隱式地由約定。

問題在於,在這種情況下,EF不會將屬性值發送給Db(不管它是否設置),因爲它假定數據庫將執行創建列值的工作。但是Db並不是,因此也是例外。

只是一個猜測。

編輯:

爲了解決這個問題,必須標誌UserIdDatabaseGeneratedOption.None

+0

UserId被設置爲'DatabaseGeneratedOption.Identity'。我應該改變這個東西嗎? – ZeroDivide

+0

對應的db列是'UserId(PK,uniqueidentifier,not null)' – ZeroDivide

+0

@零分區:是的,'DatabaseGeneratedOption.None'是解決方案。 'uniqueidentifier'/guid列不會在SQL Server中自動生成。 – Slauma

相關問題