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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值