开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 4576|回复: 2

改变XPO生成的数据库对象名称规则

[复制链接]

0

精华

74

贡献

722

赞扬

正版授权组

Rank: 14Rank: 14Rank: 14Rank: 14

帖子
183
软币
3861
在线时间
327 小时
注册时间
2013-6-7
发表于 2013-6-15 23:39:51 | 显示全部楼层 |阅读模式
我们知道XPO实体类定义好后, XPO可以自动生成数据库表, 但是表名默认是和类名一样的,区分大小写, 这在Oracle中,如需要从后台维护数据时书写SQL会很不方便.
比如:
  1. public class MyTable : XPObject
  2. {
  3. ......
  4. }
复制代码
这样自动生成的表名为 MyTable, 在 SqlServer 中, 表名我们可以不区分大小写的使用, 但在 Oracle 不行, 必须用双引号括起来区分大小写.

我们可以为该类添加一个属性指定数据库中的表名
  1. [Persistent("MY_TABLE")]
  2. public class MyTable : XPObject
  3. {
  4. ......
  5. }
复制代码
这样生成的表名即为 MY_TABLE.

现在我们更改XPO自动生成的对象名称的规则, 就是继承已有的 XpoProvider, 然后 覆写其中的 ComposeSafeTableName 方法. 以下代码将对象名称转换为大写,且在每一个拼写单词之间增加一个下划线, 如名称为EmployeeNo, 则自动生成EMPLOYEE_NO的名称.
  1. public class MyODPConnectionProvider : ODPConnectionProvider
  2. {
  3.     public const string MyODPProviderTypeString = "MyODP";
  4.     public static IDataStore CreateMyODPProviderFromString
  5.         (string connectionString, AutoCreateOption autoCreateOption,
  6.             out IDisposable[] objectsToDisposeOnDisconnect)
  7.     {
  8.         IDbConnection connection = ODPConnectionProvider.CreateConnection(connectionString);
  9.         objectsToDisposeOnDisconnect = new IDisposable[] { connection };
  10.         return new MyODPConnectionProvider(connection, autoCreateOption);
  11.     }

  12.     static MyODPConnectionProvider()
  13.     {
  14.         RegisterDataStoreProvider(MyODPProviderTypeString,
  15.             new DataStoreCreationFromStringDelegate(CreateMyODPProviderFromString));
  16.     }
  17.     public new static void Register() { }

  18.     public MyODPConnectionProvider(IDbConnection connection, AutoCreateOption autoCreateOption)
  19.         : base(connection, autoCreateOption)
  20.     {
  21.     }

  22. private string MyFormatName(string name)
  23.     {
  24.         System.Text.RegularExpressions.Regex r;
  25.         r = new Regex("([a-z0-9])([A-Z])", RegexOptions.Singleline);
  26.         return r.Replace(name, "$1_$2");
  27.     }

  28.     public override string ComposeSafeTableName(string tableName)
  29.     {
  30.         return base.ComposeSafeTableName(MyFormatName(tableName)).ToUpper();
  31.     }

  32. }
复制代码
使用的时候先注册该 Provider, 之后就可以使用了.
  1. MyODPConnectionProvider.Register();
  2.             string connectionString = "XpoProvider=MyODP;DATA SOURCE=//127.0.0.1/ORCL;USER ID=test;PASSWORD=test;";
  3.             XpoDefault.ConnectionString = connectionString;
  4.             MyTable myTable = new MyTable();
  5.             myTable.Name = "Nyfor";
  6.             myTable.BirthDate = DateTime.Now.AddYears(-30).Date;
  7.             myTable.Save();
复制代码
  1.     public class MyTable : XPObject
  2.     {
  3.         public MyTable()
  4.             : base()
  5.         {
  6.         }

  7.         public MyTable(Session session)
  8.             : base(session)
  9.         {
  10.         }

  11.         public string Name { get; set; }

  12.         public DateTime BirthDate { get; set; }

  13.     }
复制代码

评分

参与人数 3贡献 +5 赞扬 +2 收起 理由
maple + 1 感谢分享
funxxoo + 1 感谢分享
羽叶 + 5 很给力!

查看全部评分

回复

使用道具 举报

0

精华

121

贡献

92

赞扬

帖子
81
软币
3644
在线时间
272 小时
注册时间
2013-6-8
发表于 2013-6-19 09:21:02 | 显示全部楼层
我对XPO还有点陌生呢。
回复

使用道具 举报

0

精华

0

贡献

7

赞扬

帖子
27
软币
202
在线时间
11 小时
注册时间
2013-9-9
发表于 2014-2-22 10:25:34 | 显示全部楼层
请教一下,在XAF中怎么使用呢?
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-4-28 17:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表