当值不为null时,无法将值null插入列中

时间:2015-11-30 09:35:19

标签: c# sql-server entity-framework

在我的c#代码中,我有一个插入到我的数据库中,但它会引发异常

  

无法将值NULL插入列'BoxID',表'Moroccanoil_Replicated.dbo.Boxes';列不允许空值。 INSERT失败。

然而,在调试这段代码时,我发现该框实际上不是null,当我在SQL SM中测试相同的插入时更进一步它工作得很好。

修改

由于某种原因,这是根据探查器实际执行的查询:

exec sp_executesql 
  N'INSERT [dbo].[Boxes]([MasterBoxID], [DateTime], [Reported], [StationID])
  VALUES (NULL, @0, @1, @2)
  SELECT [BoxID]
  FROM [dbo].[Boxes]
  WHERE @@ROWCOUNT > 0 AND [BoxID] = scope_identity()',
  N'@0 datetime2(7),@1 bit,@2 int',@0='2015-11-30 13:37:46.4714394',@1=0,@2=7

有谁知道为什么会这样以及如何解决它?

更多相关信息:

  • db.SaveChanges()调用发生异常,而不是插入。
  • BoxID未定义为身份。

以下是调试模式中带有插入值的代码: enter image description here

在SQL中的相同插入工作正常: enter image description here

2 个答案:

答案 0 :(得分:6)

如评论中所述:

EF很可能不会传递ID参数,因为它认为该值是由数据库创建的。这意味着您应该关闭此列的DatabaseGeneratedOptions.Identity。

使用DatabaseGeneratedOption.Identity,EF不会将ID值传递给数据库,因为它怀疑它是由DBMS提供的。当它怀疑具有给定Id值的对象在数据库中时,这可能导致此问题或DbUpdateConcurrencyException,但它实际上已被DBMS更改。

答案 1 :(得分:0)

如前所述,EF 不会将 ID 列传递给数据库。如果您有不希望有自动增量值的情况,下面是一个例子

public class PackingInventory
{

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }