2017-04-01 255 views
2

所以即時嘗試向實體添加實例時遇到了這個奇怪的問題。它是一個使用EF 6.0的asp.net應用程序。無法將NULL插入到列中,但值不爲空

例外:

SQLEXCEPTION:無法將NULL值插入列 '的OrderId', 表 'BETA.MDF.dbo.Orders';列 不允許有空值。 INSERT失敗。該語句已終止。

我的代碼:

User user = (User)Session["CurrentUser"]; 
BetaEntities entities = new BetaEntities(); 

Beta.Order order = new Beta.Order(); 
order.OrderId = Guid.NewGuid().ToString(); 
order.OrderDate = DateTime.Now; 
order.OrderedBy = user.UserId; 
order.HandledBy = entities.Users.Where(x => x.Rank > 0).Select(i => i.UserId).FirstOrDefault(); 

entities.Orders.Add(order); 

entities.SaveChanges(); 

我的表: enter image description here

而且這是我的訂單班,我已經嘗試過[Databasegenerated]

public partial class Order 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string OrderId { get; set; } 
    public System.DateTime OrderDate { get; set; } 
    public int OrderedBy { get; set; } 
    public int HandledBy { get; set; } 
} 

示例項:

enter image description here 如果您需要更多詳細信息,請告訴我。

編輯:

我嘗試設置的OrderID的數據庫數據類型,以UNIQUEIDENTIEFIER和更新的實體模型,數據庫應產生的GUID(我刪除本身,但我仍然得到同樣的異常

這是我的新類:

public partial class Order 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public System.Guid OrderId { get; set; } 
    public System.DateTime OrderDate { get; set; } 
    public int OrderedBy { get; set; } 
    public int HandledBy { get; set; } 
} 

enter image description here

enter image description here

編輯:

,如果我做的OrderID NULLABALE並刪除主鍵,我得到以下異常:

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:「商店更新,插入或刪除語句影響意外數量的行(0)。自實體加載後,實體可能已被修改或刪除。有關理解和處理樂觀併發異常的信息,請參閱http://go.microsoft.com/fwlink/?LinkId=472540。'

但是這可以通過添加一個主鍵:(所以去除PK並使其NULLABLE心不是工作來解決。

此外,我需要分配給自己的GUID進一步的目的,從而讓數據庫分配GUID本身(與[DatabaseGenerated(DatabaseGeneratedOption.Identity)])也不是一個選項。

+0

看到[this](http://stackoverflow.com/questions/8855100/why-is-ef-trying-to-insert-null-in-id-column)不確定,但它可能會幫助你,祝你好運 –

+0

您會得到非常明確的異常消息:_Cannot無法將值NULL插入到'OrderId'列中,因爲列不允許爲nulls_。只需設置列以允許「NULL」值。 – Fabio

+0

身份字符串是無用 – brykneval

回答

2

你的問題是,你設置DatabaseGenerated屬性爲OrderId列。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public string OrderId { get; set; } 

有了這個屬性EF會忽略值y ou設置爲OrderId,「try」生成唯一值,但在生成INSERT查詢時,生成唯一值將不適用於stringOrderId將爲NULL

如果你是「第一碼」使用EF然後更改的OrderId類型Guid和代碼

order.OrderId = Guid.NewGuid().ToString(); 

刪除下一行並留下DatabaseGenerated屬性,因爲它是。
當使用DatabaseGenerated屬性列 - 意味着該列的值將通過數據庫來生成。

更改Order類的結構後,需要相應更新數據庫。如果您使用「代碼優先」的方法,那麼您需要生成遷移腳本並在數據庫中運行它。在「數據庫優先」的方法你需要手動更新數據庫

即使你說刪除DatabaseGenerated屬性並沒有幫助,它將是最簡單的解決方案,正如Ivan Stoev在評論中所建議的。
因爲你自己使用Guid.NewGuid().ToString()生成唯一的字符串。

+0

如果我刪除它,我仍然得到同樣的異常 –

+0

有兩件事情,從這個答案丟失:改變OrderId'的'類型'Guid',是的。但也要調整數據庫中的列類型以匹配,並給它一個默認約束'newid()'(或'newsequentialid()')。 – hvd

+0

如果你刪除它 - 它應該工作,如果數據庫相應地更新。 – Fabio

相關問題