`
hulunberbus
  • 浏览: 857308 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

基于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;
}
}

}
}

修改完成后编译再运行。全部通过

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics