1 、表单请求提交到控制器中的方法 如果表单中name属性中的值恰好和方法参数中的模型的属性对应上的时候,会自动赋值给参数模型对象的属性,
包括表单中的字符串格式的时间也会自动转换成对象的时间类型的属性
2 、关于 SaveChanges()方法的int返回值问题 :有两个例子
一
RoleInfo roleInfo = this.CurrentDBSession.RoleInfoDal.LoadEntities(r => r.ID == roleId).FirstOrDefault();
if (roleInfo != null)
{
roleInfo.ActionInfo.Clear();//此时导航属性ActionInfo有4个对象ID为1234 var roleActionList = this.CurrentDBSession.ActionInfoDal.LoadEntities(a => Actions.Contains(a.ID));//此处进行的只有对数据库的读取操作
foreach (var item in roleActionList) { roleInfo.ActionInfo.Add(item); //此处添加的四个对象也是上面的ID为1234的 } this.CurrentDBSession.SaveChanges() //以上两次对数据库的操作都没有实际进行,再此如果需要修改数据库一次完成(中间加锁 不会有其他用户的操作影响数据)
// 在对数据库操作之前 EF发现两次清空和添加的对象恰好一样,对数据库没有改变,所以根本不会操作数据库 SaveChanges()返回值是0 【自己删完自己加回来】
二
Db.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified; //此处要修改的实体Entity和之前查出来的即使一样,也会覆盖到数据库,因为EF不知道数据库中的数据是什么,也不知道在上次读取后时否有其他人修改了,所以不管是否一样, 都直接覆盖掉
Db.SaveChanges();//此处返回值>0;数据库有修改
总结 :1通过 导航属性的add() 或clear()方法 修改EF模型然后SaveChanges()保存到数据库 返回值不一定>0 因为EF会先分析模型时否发生了改变 如果没变根本就不会修改数据库
2:通过 Db.Entry<T>(entity).State 修改的数据 ,(一)即使一样,也会覆盖掉原来的 返回值一定>0 (二)在同一个SaveChanges()方法内 对同一条记录不能既有添加又有修改,否则会报错((三)对同一条数据两次修改没关系,返回值也是1条 是最后修改的结果)
3 :一个SaveChanges里有多条对同一记录操作的Db.Entry().State语句,只取最后一句有效 (这就解释了以上第二三条)
3、EF对于自定义主键表 非GUID或Int自增 类型 插入的时候 会报主键不能为空(即使设置了主键值),此时 修改edmx文件中该属性的属性StoreGeneratedPattern为none