我以前是JAVA程序员,现因公司的需国转向.net,但对以前JAVA的开发思想和方法非常怀念特别是Hibernate,我想C#和java是那么的相象,也应该有ORM框架的吧.Google一下就发现了Grove这个很好的工具.这个工具小七而实用.不过就那个短短的几句帮助文件,在使用过程中还是碰到很多问题的.
在以前的使用中,因为数据库的主键都是自增长的,一直没有发现问题,不过有一次应用时主键不是自增长的,就出现问题了,生的的一个Users表的类如下:
namespace
f2f
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
using System;
using Grove.ORM;
[DataTable("f2f_users")]
public class f2f_users
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
String _userID;
String _username;
DateTime _lastVisist;
String _lastIP;
String _userType;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
[KeyField("userID")]
public String userID
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get...{return this._userID;}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
set...{this._userID=value;}
}
[DataField("username")]
public String username
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get...{return this._username;}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
set...{this._username=value;}
}
[DataField("lastVisist")]
public DateTime lastVisist
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get...{return this._lastVisist;}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
set...{this._lastVisist=value;}
}
[DataField("lastIP")]
public String lastIP
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get...{return this._lastIP;}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
set...{this._lastIP=value;}
}
[DataField("userType")]
public String userType
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get...{return this._userType;}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
set...{this._userType=value;}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public bool save()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
ObjectOperator oo = getObjectOperator.getOperator();
oo.Insert(this);
return true;
}
catch(Exception e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
log.write("保存用户信息失败"+e.ToString());
return false;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public bool update()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
ObjectOperator oo = getObjectOperator.getOperator();
oo.Update(this);
return true;
}
catch (Exception e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
log.write("更新用户信息失败" + e.ToString());
return false;
}
}
}
}
我在调用save方法存对象到数据库时,总是出错.后来看一个提示:
不能将值 NULL 插入列 'userID',表 'stockstar_f2f.dbo.f2f_users';列不允许有空值。INSERT 失败。
语句已终止。Trace info:INSERT INTO [f2f_users] ([username],[lastVisist],[lastIP],[userType]) VALUES (@username,@lastVisist,@lastIP,@userType)
很明显,没有插入主键userID,后来反编译一下,反现:
private UniqueIDType pkType = UniqueIDType.AutoIdentitiy;
原来默认主键是自增长的,后来我查了一下资料,把KeyFeild做了如下修改就保存成功了.
[KeyField("userID", KeyType = UniqueIDType.OtherDefinition)]