【问题标题】:Data Entity error "An error occurred while updating the entries. See the inner exception for details."数据实体错误“更新条目时发生错误。有关详细信息,请参阅内部异常。”
【发布时间】:2018-02-19 03:41:16
【问题描述】:

我是 Entity Framework 的新手,我已经在 google 中搜索过这个问题,但我什么也没找到。我收到错误

更新条目时出错。有关详细信息,请参阅内部异常。

当我检查内部异常时,我看到了这个

无法将值 NULL 插入到列“DOCNUM”、表“TCPIDBV2.dbo.tbl_200_Dailyreport”中;列不允许空值。插入失败。

但是当我检查我传入的要保存在数据库中的记录时,该对象中有一个名为“DOCNUM”的值

这是我的代码:

[Table("tbl_200_Dailyreport")]
public class tbl_200_Dailyreport
{
    [Key]
    [Required]
    public long DOCNUM {get; set;}
    public DateTime DAILYREPDATE {get; set;}
    public string SECTION {get; set;}
    public string REMARKS { get; set; }
    public int? OPERATIONTIME { get; set; }
    public int? PREPARATIONTIME { get; set; }
    public int? STANDBYTIME { get; set; }
    public int? MATERIALWAITING { get; set; }
    public int? ASSISTTIME { get; set; }
    public int? MAINTENANCETIME { get; set; }
    public int? CLEANINGTIME { get; set; }
    public bool? ISOVERTIME { get; set; }
    public bool? ISLOCKED { get; set; }
    public string SHIFT { get; set; }
    public int? PRODTIME { get; set; }
    public int? BREAKTIME { get; set; }
    public double? TOTALCOLOR { get; set; }
    public double? AVERAGECOLOR { get; set; }
}

获取上述值的代码如下:

tbl_200_Dailyreport.DOCNUM = long.Parse(txtReferenceNo.Text);
tbl_200_Dailyreport.PRODTIME = Convert.ToInt32(txtProduction.Text);
tbl_200_Dailyreport.OPERATIONTIME = Convert.ToInt32(txtOperation.Text);
tbl_200_Dailyreport.PREPARATIONTIME = Convert.ToInt32(txtPreparation.Text);
tbl_200_Dailyreport.STANDBYTIME = Convert.ToInt32(txtStandby.Text);
tbl_200_Dailyreport.MAINTENANCETIME = Convert.ToInt32(txtMaintenance.Text);
tbl_200_Dailyreport.CLEANINGTIME = Convert.ToInt32(txtCleaning.Text);
tbl_200_Dailyreport.MATERIALWAITING = Convert.ToInt32(txtMaterial.Text);
tbl_200_Dailyreport.ASSISTTIME = Convert.ToInt32(txtAssist.Text);
tbl_200_Dailyreport.BREAKTIME = Convert.ToInt32(txtOthers.Text);
tbl_200_Dailyreport.DAILYREPDATE = dtpDailyReportDate.Value;
tbl_200_Dailyreport.SHIFT = cboShift.SelectedValue.ToString();
tbl_200_Dailyreport.ISOVERTIME = cbxOvertime.Checked;
tbl_200_Dailyreport.ISLOCKED = false;
tbl_200_Dailyreport.REMARKS = txtRemarks.Text;

if (!String.IsNullOrEmpty(cboSecDepartment.Text)) 
{
    tbl_200_Dailyreport.SECTION = cboSecDepartment.SelectedValue.ToString(); 
}
else
{
    var section = "0";
    tbl_200_Dailyreport.SECTION = section;
}

我允许除名为“DOCNUM”的 PK 之外的所有列为空,因此在获取“DOCNUM”的值时,txtreferenceno.Text 的值等于 1。并在 DailyReportManager 中传递它,所以这里是代码:

public void Save(tbl_200_Dailyreport records)
{
        try
        {
            this.db.tbl_200_Dailyreport.Add(records);
            this.db.SaveChanges();
        }
        catch (Exception ex)
        {
            throw ex;
        }
}

并在获取txtreferenceno.Text的值

var max = dailyreportmanager.FindAll().Max(x => (int?)x.DOCNUM) ?? 0;
var addMax = max + 1;
txtReferenceNo.Text = Convert.ToString(addMax);

所以对于我的数据库的设计

请允许我发一张截图:

Database Design

当我检查记录时,“DOCNUM”的值等于 1,但为什么我仍然收到该错误?请帮忙。提前非常感谢。

【问题讨论】:

  • DOCNUM 是自动生成/自动增量列吗?查看表的 SQL 定义可能会有所帮助。
  • @Ron Beyer 我编辑了我的帖子。现在好点了吗?
  • @mjwill 哇,你真是个天才。非常感谢您的建议解决了我的问题。

标签: c# entity-framework


【解决方案1】:

要向实体框架指示您要手动指定键值,请指定此属性:

[DatabaseGenerated(DatabaseGeneratedOption.None)]

反对DOCNUM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多