【问题标题】:INSERT into DB with Entity Framework SqlException使用实体框架 SqlException 插入数据库
【发布时间】:2017-04-14 07:44:34
【问题描述】:

我正在通过实体框架将新实体插入数据库,设置所有属性,但代码仍然向我抛出带有文本的 SqlException:

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

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

代码:

            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; }

}

【问题讨论】:

  • 请在您的问题中发布您的代码,以便我们查看问题所在..
  • 知道这样做SELECT MAX(...) + 1 来获取您的新唯一 主键非常糟糕?在一个有几个并发用户的繁忙系统中,您迟早会有重复的值 - 这对于主键不是是件好事!
  • 这只是我测试缓存的项目,我不以任何并发方式使用这个数据库。我是唯一可以访问此数据库的人。

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


【解决方案1】:

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

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

这里的关键是放置属性:

  1. 数据库生成

到 C_CUSTKEY 列。显然我们正在解决的问题是 默认情况下,该实体框架期望使用以下键进行插入 身份。

【讨论】:

  • 我不使用我的数据库,我不能改变它的模型或任何东西......客户表总是包含一些数据,所以这不是问题。我对其进行了调试,并将 maxCustomerId 设置为特定数字。
  • 好的,然后请打开您的 edmx 模型,从那里删除您的表并再次添加它。它肯定会工作
  • 但我使用的是 Code First,我没有 edmx 文件 :(
  • 大声笑,你应该指定它。请在您的问题中发布您的Customers 课程
  • 同时发布您的Nation 对象
【解决方案2】:

您是否更新了 EDMX 模型?

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

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

【讨论】:

  • 我还没有更新我的模型。在我的数据库中,主键没有被指定为增量标识,所以我手动增加它(见代码)
  • 在这种情况下,我会说 C_CUSTKEY 是一个可为空的字段,并且表没有任何 C_CUSTKEY 不为空的行。那会让; db.Customers.Max(o => o.C_CUSTKEY) 返回空值。当您执行 +1 时,它会再次返回 null,因此您可能在那里设置了一个 null 值。会这样吗?
  • 当我调试这个时,maxCustomerId 被设置为一个特定的数字
  • 你能附上你的表创建SQL,我感觉像个史酷比,试图解开一些谜团
猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2020-05-24
相关资源
最近更新 更多