您的位置:首页 > 数据库

基于Grove的.NET应用程序开发提示1--数据库主键设置问题

2005-07-13 10:46 826 查看
基于Grove的.NET应用程序开发提示

前几日从http://grove.91link.com下载了grove组件,发觉其对于ORM一块做的不错。想
想自己以前做代码生成时,都是先生成好TSQL语句,然后在生成的类中调用。虽然也一
直在考虑在程序运行时动态生成SQL的的想法,但一直都没有去做这一块。
在使用grove组件时,我先仔细看过其教程,觉得很好操作,事实上也是如此。
在自己实践时,按着其教程先做映射类。然后调用ObjectOperator对象的Insert 等方法
,很快实现了。但是当我将表的结构更改了一下后。发觉存在一个问题。也就是默认情
况下,实体类中的KeyField属性指示的类属性其对应的数据库字段必须是自动增长性的

如数据库中有一张表名为Customer,有二列,OID是主键同时为自动增长性数字,DeptID
为nvarchar(50),那么其对应映射类如下
namespace JadeSoft.Logistics.SystemInfo
{
using System;
using Grove.ORM;
using JadeSoft.Common;
[DataTable("sDepartment")]
public class Department {
int _OID;
String _DeptID="";

[KeyField("OID")]
public Int OID
{
get{return this._OID;}
set
{
this._OID=value;
}
}
[DataField("DeptID")]
public String DeptID
{
get{
return this._DeptID;
}
set{
this._DeptID=value;
}
}

}
}

此时将对象保存到数据库相对比较简单
ObjectOperator objOpt=new ObjectOperator();
objOpt.Insert(objDepartment );就可以了。
如果我们现在将结构更改一下。将Department 表的OID设为GUID类型的同时也为主键,但没有将OID列的默认值设为 newid()。
第二列不变。
这时自动生成的映射类如下
namespace JadeSoft.Logistics.SystemInfo
{
using System;
using Grove.ORM;
using JadeSoft.Common;
[DataTable("sDepartment")]
public class Department {
Guid _OID;
String _DeptID="";

[KeyField("OID")]
public Guid OID
{
get{return this._OID;}
set
{
this._OID=value;
}
}
[DataField("DeptID")]
public String DeptID
{
get{
return this._DeptID;
}
set{
this._DeptID=value;
}
}

}
}
此时如同上面的插入操作,则会发生一个错误。提示其实是OID不能为NULL。我用SQL事件跟踪器进行跟踪发觉动态生成的Insert语句是这样的
Insert Department (DeptID) values('aaaa'). 这样的语句当然是不能正常运行的。我对Grove内部生成SQL语句的原理感到很好奇,于是对其进行了反编译。原来GROVE默认情况下如果KeyField属性类修饰的属性是指自动增长性的。所以第一次我没有错误产生,因为对于自动增长列来说是不生成insert语句的,可是改了结构后,我没有指明此OID此属性不是自动增长性。在反编译后的代码中对于KeyField的类型来说有二种。反编译后的代码如下。
using System;

namespace Grove.ORM
{
[AttributeUsageAttribute(AttributeTargets.Property)]
public class KeyFieldAttribute : BaseFieldAttribute
{
private UniqueIDType pkType = UniqueIDType.AutoIdentitiy;

public UniqueIDType KeyType
{
get
{
return pkType;
}
set
{
pkType = value;
}
}
public KeyFieldAttribute(string columnName) : base(columnName)
{
}
}
}
namespace Grove.ORM
{
public enum UniqueIDType
{
AutoIdentitiy = 0,
OtherDefinition = 1,
}
}
看到这里我就知道应该如何对付眼前出现的BUG了。这些可是GROVE自带的HELP中没有提到了。
其实我只要给KEYField指明一下不是自动增长性的就可以了。
修改后的代码如下
namespace JadeSoft.Logistics.SystemInfo
{
using System;
using Grove.ORM;
using JadeSoft.Common;
[DataTable("sDepartment")]
public class Department {
Guid _OID;
String _DeptID="";
//这里给OID属性指明是数据库对应的主键列OID列,同时OID列是非自动增长的。
[KeyField("OID",KeyType=UniqueIDType.OtherDefinition)]
public Guid OID
{
get{return this._OID;}
set
{
this._OID=value;
}
}
[DataField("DeptID")]
public String DeptID
{
get{
return this._DeptID;
}
set{
this._DeptID=value;
}
}

}
}
修改完成后编译再运行。全部通过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐