说说在MVC开发中,遇到的错误及解决方法(本文章是我在实际开发中总结出来的,希望对您有帮助)
前提:数据底层,使用的是MVC架构,对于数据表中的状态及相关字段,采用了枚举型进行对应
1 序列中不包含任何元素
解决:将Single()改为DefaultOrSingle()
2 序列包含一个以上的元素
解决:很多情况都是原始数据的问题
3 不能在已使用的实体上添加新实体
4 Duplicate key is already ,
3,4的解决为:用 base._db.ExecuteCommand()进行SQL语句的重写,
不要用LINQ自带的insert,就不会出现错误了
5 未将对象引用设置到对象的实例。 值不能为空。参数名: source。
解决: this.iProduct_ProductFilesRepository.Insert(_entity.Product_ProductFile.Cast<Entity.IDataEntity>().ToList());,当遇到将list实体类型换为接口list规范时,应该用.Cast<接口类型>().ToList()
6 查询参数不能为“System.Object”类型。
解决:这是因为在LINQ的ExecuteCommand不理解空值,当我们传递的参数为 null 时,就会出现这个问题,解决方法是,在为实体加string.empty这个空值属性
7 Incorrect syntax near '@p0'.
解决:查看我们的SQL代码,被编译成了什么,可能是多个括号之类的。如:delete from users where (userid={0},这很明显是不对的,哈哈
8 不支持SQL的转化
解决1,看看是否用了枚举类型,如果用了,应该先把IQueryable进行ToList,得到真正的数据后才能进行判断
解决2,请看你的原始数据,很有可以是数据问题
解决3,请看程序代码的关联表查询,很可能是它没有找出数据的问题
9 未将对象引用设置到对象的实例。
解决:查看数据库向数据实体赋值时,枚举类型的字段是否为null了,如果为null,就会出错
10 查询包含对不同数据上下文上所定义项的引用。
解决:查看底层工厂建立是否返回datacontext有问题,是否为空了。
11 枚举在LINQ中引发的异常:不支持SQL转换
当枚举使用字符名称,没有数据,然它的数值存储在数据表中时,我们在返回数据时,必须在ToList()才行,否则就会出现这种问题
例如:
/// <summary>
/// 以下是一个积分类型的枚举,一种类型对应数据表中同样类型的一个数值
/// </summary>
public enum PrestigeTypeCode
{
IAsk_Question,
IAsk_Answer,
}
//表据表如下:
ID 描述 数值 枚举名称
1 提问 1 IAsk_Question
2 回答 1 IAsk_Answer
结论:当我们通过枚举去从数据库(SQLSERVer里)取数值时,必须要把结果集ToList()才行,如代码:
int value = new PrestigeTypesRepository().GetPrestigeTypes().ToList().Where(item => item.PrestigeTypeCode == prestigeTypeCode).Single().Amount;
如果,枚举的值,在枚举元素里读上,就不用去tolist()了
12 不能将 Null 值赋给类型为 System.Int32 (不可为 null 的值类型)的成员
解决:应该是数据的问题,Int类型的SQL表中出来了NULL值,或者是由于枚举类型转换失败的原因