2017-04-14 56 views
0

我插入新的实体将通过实体框架的数据库,设置所有属性,但代码仍然抛出我用文字把SQLException:INSERT到DB与实体框架SQLEXCEPTION

无法插入NULL值插入列C_CUSTKEY,表y;列不允许有空值。

但我手动设置所有属性,它们不是null。什么会导致这个问题?

代码:

  maxCustomerId = db.Customers.Max(o => o.C_CUSTKEY) + 1; 
      var customer = new Customer 
      { 
       C_CUSTKEY = maxCustomerId, 
       C_NATIONKEY = 1, 
       C_NAME = "Peter", 
       C_ADDRESS = "Praha", 
       C_COMMENT = "Best customer", 
       C_ACCTBAL = 0, 
       C_PHONE = "12345" 
      }; 
      db.Customers.Add(customer); 
      db.SaveChanges(); 

这是我的客户单位:

public class Customer 
{ 
    [Key] 
    public int C_CUSTKEY { get; set; } 

    public string C_NAME { get; set; } 

    public string C_ADDRESS { get; set; } 

    public int C_NATIONKEY { get; set; } 

    [ForeignKey("C_NATIONKEY")] 
    public virtual Nation Nation { get; set; } 

    public string C_PHONE { get; set; } 

    public decimal C_ACCTBAL { get; set; } 

    public string C_COMMENT { get; set; } 

} 

国家实体:

public class Nation 
{ 
    [Key] 
    public int N_NATIONKEY { get; set; } 

    public string N_NAME { get; set; } 

    public int N_REGIONKEY { get; set; } 

    [ForeignKey("N_REGIONKEY")] 
    public virtual Region Region { get; set; } 

    public string N_COMMENT { get; set; } 

} 

地区实体:

public class Region 
{ 
    [Key] 
    public int R_REGIONKEY { get; set; } 

    public string R_NAME { get; set; } 

    public string R_COMMENT { get; set; } 

} 
+0

请在您的问题中发布您的代码,以便我们可以看到什么问题是。 –

+1

您**知道**这样做'SELECT MAX(...)+ 1'来获取您的新**独特的**主键是非常糟糕的?在一个拥有少量并发用户的繁忙系统中,比早些时候更早,你将**重复值** - 这对于主键来说不是一件好事! –

+0

这只是我测试缓存的项目,我没有以任何并发方式使用这个数据库。我是唯一可以访问这个数据库的人。 – MacakM

回答

2

请装饰Customer实体的主键属性如下

[DataMember, Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int C_CUSTKEY { get; set; } 

这里的关键是把属性:

  1. 重点
  2. DatabaseGenerated

到C_CUSTKEY列上。显然,我们正在争取的问题是 ,实体框架默认情况下希望插入的密钥是 身份。

+0

我不使用我的数据库,我不能改变它的模型或任何东西......客户表总是包含一些数据,所以这不是问题。我放弃了它,maxCustomerId被设置为特定的数字。 – MacakM

+0

好吧,然后PLZ打开你的EDMX模型,从那里删除你的表,并再次添加它。它肯定会工作 –

+0

但我使用代码第一,我没有edmx文件:( – MacakM

0

您是否更新了EDMX型号?

如果你还没有,实体框架无法知道你是否已经改变了你的数据库列属性。如果打开模型并右键单击并选择“从数据库更新模型”,然后按“完成”,它应该完成这项工作。

此外,您可以检查是否有一些未在数据库中指定为增量标识列的主键,并且未在代码上设置任何值。

+0

我还没有更新我的模型。在我的数据库主键没有指定为增量身份,所以我手动增加它(见代码) – MacakM

+0

在这种情况下,我会说C_CUSTKEY是一个可空字段和表没有任何行C_CUSTKEY不为空。 这会使; db.Customers.Max(o => o.C_CUSTKEY)返回null。 当您执行+1操作时,它会再次返回空值,因此您可能会在此处设置空值。那会是吗? –

+0

当我调试这个时,maxCustomerId被设置为一个特定的数字 – MacakM