使用Entity Framework SqlException插入DB

时间:2017-04-14 07:44:34

标签: c# entity-framework ef-code-first sqlexception

我通过实体框架将新实体插入到数据库中,设置所有属性,但代码仍然抛出带有文本的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; }

}

2 个答案:

答案 0 :(得分:2)

请按以下方式装饰Customer实体的主键属性

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

这里的关键是放置属性:

     
      
  1. Key
  2.   
  3. DatabaseGenerated
  4.         

    到C_CUSTKEY列。显然我们正在争论的问题是   默认情况下,Entity Framework希望执行带有键的插入   身份。

答案 1 :(得分:0)

您是否更新了EDMX型号?

如果还没有,Entity Framework无法知道您是否更改了数据库列属性。如果打开模型并右键单击并选择“从数据库更新模型”,然后按“完成”,则应该完成工作。

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