问题:将原来.Net4.0+EF+sql2008系统迁到.NetCore + EF + SQL 2005上。在保存数据时出现
“An error occurred while updating the entries. See the inner exception for details”的错误。
迁移后,开发环境是sql2008 但客户那里是sql2005,所以原来的EFCore配置就要进行一些修改。
原因:
1、原sql2008的库支持date类型,sql2005中不支持。
解决方案:需在Context中改成datetime类型。
modelBuilder.Entity<W_WorkFlowApply>(entity =>
{
//原来的entity.Property(e => e.WfaAddtime).HasColumnType("date");
entity.Property(e => e.WfaAddtime).HasColumnType("datetime");
});
这个查了好多资料,还有的说是因为EF默认将date类型的字段转为datatime2类型,而sql2005不支持datetime2类型。故需要在配置里明确其类型为sql2005支持的类型datetime。
2、自增列主键的问题。
使用EF进行存表操作时原.Net4.0+EF+sql2008系统无需在声明对象时对 ID (自增列)进行赋值。
如下图:
//Sys_User表 有三个字段 ID(自增列主键)、UerName、PassWord
Sys_User UserModel = new Sys_User();
UserModel.UerName= "SanMao";
UserModel.PassWord= "111111";
db.Sys_User.Add(UserModel);
db.SaveChanges();
但迁移后再这么写就会报错,断点跟踪了一下UserModel 在SaveChanges()前其ID=0,在SaveChanges()后其ID就变成了-21737。
解决方案一:我的解决方案时将ID列改成varchar(50)类型,然后对其使用GUID进行赋值
//Sys_User表 有三个字段 ID(自增列主键)、UerName、PassWord
Sys_User UserModel = new Sys_User();
UserModel.ID = Guid.NewGuid().ToString();
UserModel.UerName= "SanMao";
UserModel.PassWord= "111111";
db.Sys_User.Add(UserModel);
db.SaveChanges();
解决方案二:这是网上的另一种解决方法,即找到Sys_User表在系统中对应的Sys_User.cs Model文件,在ID字段加上数据注解特性。原文链接:https://blog.csdn.net/zhangpeterx/article/details/95678630
public class Sys_User
{
[ScaffoldColumn(false)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string UserName{ get; set; }
public string PassWord{ get; set; }
}
3、批量增加数据的问题。
我的解决方法是在for中进行SaveChanges(),这种方案肯定会影响效率,好在系统中这么处理的数据不多,在可接受的范围内。
UserNameList.ForEach(name=>
{
Sys_User UserModel = new Sys_User();
UserModel.ID= Guid.NewGuid().ToString();
UserModel.UserName = name;
UserModel.UserID = userID.ToString();
UserModel.PassWord= "111111";
db.Sys_UserSetModule.Add(model);
db.SaveChanges();
});
目前我是尚未找到其他解决方案。欢迎大神抨击我。