新增实体时,为什么主键ID是0?

落阳 2012-06-17 05:54:46


实体类代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;

namespace DataEntity
{
[Table("Hr_Department")]
public class Department
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DeptID { get; set; }

[Display(Name = "部门名称")]
[StringLength(100)]
[Required(ErrorMessage = "部门名称不能为空")]
public string DeptName { get; set; }

[Display(Name = "上级部门")]
public int? ParentID { get; set; }

[Display(Name = "部门编号")]
[StringLength(100)]
[Required(ErrorMessage = "部门编号不能为空")]
public string DeptCode { get; set; }

[Display(Name = "电话")]
[StringLength(100)]
public string DeptPhone { get; set; }

[Display(Name = "传真")]
[StringLength(100)]
public string DeptFax { get; set; }
}
}


前台代码如下:
@using (Html.BeginForm("", "", FormMethod.Post, new { id = "deptForm" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend id="legendText">编辑部门</legend>
<div id="keyField">
@Html.HiddenFor(model => model.DeptID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DeptName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DeptName)
@Html.ValidationMessageFor(model => model.DeptName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DeptCode)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DeptCode)
@Html.ValidationMessageFor(model => model.DeptCode)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DeptPhone)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DeptPhone)
@Html.ValidationMessageFor(model => model.DeptPhone)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DeptFax)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DeptFax)
@Html.ValidationMessageFor(model => model.DeptFax)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ParentID)
</div>
<div class="editor-field">
<input id="ParentID" name="ParentID" value="@ParentID" required="true" />
</div>
<p>
<input type="button" value="保存" onclick="saveDeptForm()" />
</p>
</fieldset>
}



因为新增时实体的ID是0,导致验证无法通过。

在另外个项目中查看了一下,正常情况下,第一张图中的DeptID应该自动获取1个自增ID值。

求解~~谢谢
...全文
453 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
落阳 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]

DeptID 是 Int 默认就是0
另外DeptID在数据库是自增长的,所以无需赋值,插入数据库的时候,DeptId会根据表内数据产生值。
所以 你这边不需要管DeptId,更不需要验证DeptId
[/Quote]
恩,经过这么多人的帮助,我也明白了,ID是不需要赋值不需要去管的。
不过一样的代码导致不一样的结果,我还是心怀纠结的说。。
保存之前的表单序列化结果图,上边是正常的,下边是有问题的。2个视图页面一样,仅仅是字段名有区别而已,比如上边的主键列叫ID,下边的叫DeptID。
hhucxyb 2012-06-18
  • 打赏
  • 举报
回复
DeptID 是 Int 默认就是0
另外DeptID在数据库是自增长的,所以无需赋值,插入数据库的时候,DeptId会根据表内数据产生值。
所以 你这边不需要管DeptId,更不需要验证DeptId
落阳 2012-06-18
  • 打赏
  • 举报
回复
检查了一下两边的jquery,serialize()一致。
落阳 2012-06-18
  • 打赏
  • 举报
回复
To yqyqyqyq0215:
我发现了一点,不知道怎么回事,新ID始终与父级ID相同。可是我在控制器或者视图中,并没有发现“使新ID与父级ID相同”的操作哇。难道是序列化方法被修改过?
落阳 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

16L应该是提前在某个地方给id赋了值
[/Quote]
我再次仔细校对了正常项目的相关代码,实在没发现“提前在某个地方赋值”的痕迹。。麻烦你帮看看。
部门控制器中:
/// <summary>
/// 新建部门 父级部门ID传入
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ActionResult Create(int id)
{
ViewBag.EditMode = "Create";
ViewBag.DeptID = id;//这是父级部门ID 与新的部门ID无关
return View("Edit");
}

部门视图,部门ID相关代码:
<div id="keyField">
@Html.HiddenFor(model => model.ID)
</div>

保存按钮脚本:
function saveDeptForm() {
alert($("#deptForm").serialize());
if ($('#deptForm').valid()) {
$.post(actionUrl, $("#deptForm").serialize(), function (result) {
if (result.success) {
$.messager.alert('提示', '数据已保存!');
$('#deptTree').tree("reload"); //刷新树
$('#cc').panel('refresh', '/Department/Grid/' + $("#ParentID").combotree("getValue")); //显示grid
} else {
$.messager.alert('提示', '数据保存出现错误!', 'error');
}
}, 'json');
}
else {
alert("验证不通过");
}
}


部门实体中ID:
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
gsralex 2012-06-18
  • 打赏
  • 举报
回复
你自己写的orm框架,生成的语句当然要自己赋值了
Chyan 2012-06-18
  • 打赏
  • 举报
回复
16L应该是提前在某个地方给id赋了值
Chyan 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 13 楼 的回复:

主键自增的话,insert语句里说不对其进行赋值的。
用linq也一样。
但因为是Int类型,所以在调试时看到的值即为0

可是我在另外一个正常的项目里,测试的结果是这样的,请问为什么啊。
[/Quote]
因为自增列是不能被手动赋值的。
但是在你表的实体中,这一列是int类型。int类型不可为空,所以默认为0。当你这条数据添加进数据库时,数据库会自动给自增列赋值。而你现在调试的时候,数据还没有增进数据库。
落阳 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

你用的什么框架,网上搜索了一下,只找到yawetag-lib这个库里包含了EntityRepository类,不知道你用的是不是这个。

自增字段的值需要在插入数据库以后才能生成,也就是要调用了Insert方法并提交数据库以后才有值,所以你那总写法肯定是有问题的。
最简单的是不要验证ID字段或者给他赋一个任意的有效值
[/Quote]
我这项目中的EntityRepository是自己写的。
B项目是根据A项目边学边做的。但是一样的底层,只是实体类的字段稍有区别而已,结果却是A项目中新增无问题,如16楼的图;B项目中却有问题,如1楼的图。

实在无法理解诶。。
落阳 2012-06-18
  • 打赏
  • 举报
回复
另外,insert是实现接口的类中写的一个方法,如下
/// <summary>
/// 插入单个实体
/// </summary>
/// <param name="entity"></param>
public void Insert(TEntity entity)
{
dbSet.Add(entity);
SaveChanges();
}
落阳 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

主键自增的话,insert语句里说不对其进行赋值的。
用linq也一样。
但因为是Int类型,所以在调试时看到的值即为0
[/Quote]
可是我在另外一个正常的项目里,测试的结果是这样的,请问为什么啊。


卷泥巴重来 2012-06-18
  • 打赏
  • 举报
回复
先看看能不能添加!
E次奥 2012-06-18
  • 打赏
  • 举报
回复
MVC3.0,做过半年,都忘得差不多了!
Chyan 2012-06-18
  • 打赏
  • 举报
回复
主键自增的话,insert语句里说不对其进行赋值的。
用linq也一样。
但因为是Int类型,所以在调试时看到的值即为0
superliu1122 2012-06-18
  • 打赏
  • 举报
回复
你用的什么框架,网上搜索了一下,只找到yawetag-lib这个库里包含了EntityRepository类,不知道你用的是不是这个。

自增字段的值需要在插入数据库以后才能生成,也就是要调用了Insert方法并提交数据库以后才有值,所以你那总写法肯定是有问题的。
最简单的是不要验证ID字段或者给他赋一个任意的有效值
gsralex 2012-06-18
  • 打赏
  • 举报
回复
哦,你用的是linq,需要把进入你的实体设计图里面,点击实体属性,选择IsDbGenerated(自动生成的值)=true
落阳 2012-06-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

Repository是否有对department赋值呢?如果你的实体框架,自增字段是会在savechanges之后直接由Ef赋值的
[/Quote]
额,不太懂你的意思。我是初学者,麻烦详细说一下。。谢谢

private DataContext db = new DataContext();
private EntityRepository<Department> DeptRepository;
public DepartmentController()
{
DeptRepository = new EntityRepository<Department>(db);
}

控制器中这些代码是有的。
gsralex 2012-06-17
  • 打赏
  • 举报
回复
Repository是否有对department赋值呢?如果你的实体框架,自增字段是会在savechanges之后直接由Ef赋值的
落阳 2012-06-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

savechange
[/Quote]
不知道你要表达什么。
superliu1122 2012-06-17
  • 打赏
  • 举报
回复
savechange
加载更多回复(6)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧