基于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;
}
}
}
}
修改完成后编译再运行。全部通过
分享到:
相关推荐
Grove Develop Component是一套基于Microsoft .NET Framework的可重用开发组件,支持多种不同数据库项目,提供标准的二层,三层及多层等开发框架. Grove Develop Component结合可复用面向对象软件开发原理(泛指设计...
Grove Develop Component是一套基于Microsoft .NET Framework的可重用开发组件,支持多种不同数据库项目,提供标准的二层,三层及多层等开发框架. Grove Develop Component结合可复用面向对象软件开发原理(泛指设计...
Grove——.NET中的ORM实现 Grove——.NET中的ORM实现
.Grove—— .Net下的ORM框架
Grove - 3-Axis Digital Compass v1.2 for arduino use Here you can fid the best schematic chart to use it in electronic Eagle conception
Grove Develop Component是一套基于Microsoft .NET Framework的可重用开发组件,支持多种不同数据库项目,提供标准的二层,三层及多层等开发框架. Grove Develop Component结合可复用面向对象软件开发原理(泛指设计...
Grove-红外线接收器基于TSOP382设计,用于接收红外信号,也可用于远程控制检测。Grove-红外线接收器上有一个IR探测器,用于获得红外线发射器发出的红外线。IR检测器内部有一个解调器,寻找38 KHz的调制IR。该红外线...
教您如何使用Arduino Grove入门套件中的压电振动传感器。
基于BeagleBone的Grove系统扩展板可以方便地将许多转换器(传感器和执行器)作为 Grove 模块与 BeagleBone 平台连接。该板还包括一个 256kb Serial EEPROM。在无焊设计和紧凑的即插即用端口的产品开发过程中,将为您...
基于grove做的系统,截取其中有代表性的登陆的代码,也相等于做个备份,想用的时候就来下载
资源名:量子计算matlab程序_包含量子蚁群算法程序_量子grove算法程序_量子神经网络算法程序等 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可...
将Grove-Rotary Angle Sensor连接到Grove-Base Shield的A0端口。 步骤3.将Grove-LED连接到Grove-Base Shield的D3端口。 步骤4.将Grove - Base Shield插入Seeeduino。 步骤5.通过USB电缆将Seeeduino连接到PC。
它支持广泛的流行的3D应用程序,如Cinema 4D, lighwave, Modo和3ds Max。 它提供了一个简单和直观的界面与自我解释的选项和工具,使您的模拟过程更简单和更快。 安装说明:...
Grove_Serial_MP3_Player 这是我用来驱动非官方库和示例代码。 它不是完美的,但是可以正常工作。 SoftwareSerial可以很好地与之通信。 只需分配一对RX / TX,将一些MP3文件存储在micro-SD卡中,即可开始使用。 ...
教您如何使用Arduino Grove Starter Kit中的LCD显示屏。
节点红色contrib grovepi信号概述如果将GrovePi的模拟输入的阈值设置为边界而发生变化,则当它高于阈值时输出为true,如果低于阈值则输出为false。检测周期为500ms。
适用于GreenHouse的Android应用程序监控系统,用于读取数据和发送到应用程序的几个传感器。 硬件组件: NodeMCU ESP8266分线板× 1 DHT11温湿度传感器(3针)× 1 SparkFun土壤湿度传感器(带螺丝端子)× 1 Seeed ...
气压高度传感器HP20x的代码开发例程