MySoft ORM组件
新版组件与之前版本不兼容,实体需要重新生成
鉴于功能的扩展,某些类重构过,方法也有所变动,使用方法基本保持与之前一致
生成工具可以直接生成对应的实体类,而不再需要新建一个项目
原有的方式仍然保留,为了方便设计自定义接口
版本号:1.6.0
1. MySoft.Data批处理和事务处理。
2. 将Trans更名为DbTrans,BeginTran方法更名为BeginTrans,新增DbBatch类。
public void AddMessages(Message[] msgs)
{
//使用批处理
DbBatch batch = DbSession.Default.BeginBatch();
for (int index = 0; index < msgs.Length; index++)
{
batch.Save(msgs[index]);
}
batch.Process();
//使用带事务批处理
DbTrans tran = DbSession.Default.BeginTrans();
DbBatch batch1 = tran.BeginBatch();
for (int index = 0; index < msgs.Length; index++)
{
batch1.Save(msgs[index]);
}
batch1.Process();
tran.Commit();
//使用单条处理
for (int index = 0; index < msgs.Length; index++)
{
DbSession.Default.Save(msgs[index]);
}
//使用带事务单条处理
DbTrans tran1 = DbSession.Default.BeginTrans();
for (int index = 0; index < msgs.Length; index++)
{
tran1.Save(msgs[index]);
}
tran1.Commit();
}
版本号:1.7.6
新增IDataPage类,通过此类来支持HtmlPager操作
使用如下:
IDataPage<Message[]> msgInfo = new DataPage<Message[]>(5);
msgInfo.RowCount = 15;
msgInfo.DataSource = null;
string linkFormat = "javascript:gotoPage($PageIndex);";
HtmlPager pager = new HtmlPager(msgInfo, linkFormat, 5);
pager.NextPageTitle = "Next Page";
pager.PrevPageTitle = "Prev Page";
pageHtml = pager.ToString();
版本号:1.7.8
1. MySoft.Data修正Entity在Remoting中系列化的问题
2. 修正了OrderByClip和WhereClip在Remoting中生成sql不正确的问题
版本号:1.8.0.0
修正了条件查询时值存在’符号产生的错误!
版本号:2.0
1.MySoft.Data中新增了子查询功能SubQuery操作
DbSession.Default.From<Message>().SubQuery().Select(Message._.ID, Message._.PostTime.Max()).GroupBy(Message._.ID.GroupBy).ToArray();
生成的SQL语句如下:
select Message.id,max(Message.posttime) as posttime from(select *from Message) as Message
DbSession.Default.From<Message>().SubQuery("c").Select(Message._.ID.At("c"), Message._.PostTime.At("c").Max()).GroupBy(Message._.ID.At("c").GroupBy).ToArray();
生成的SQL语句如下:
select c.id,max(c.posttime) as posttime from(select *from Message) as c
group by c.id
2.MySoft.Data中修正了枚举类型从数据库读取后转换的问题
版本号:2.1.0
ORM新增内存查询功能
MemoryFrom<Message> query = DbSession.Default.From<Message>().ToMemory(); //获取主键为1的Message信息
Message msg = query.Get(1); //获取ID为1,2,3的数组
Message[] msgs1 = query.Where(Message._.ID.In(1,2,3)).ToArray();
//获取按分页,每页10条中的第3页,Message._.ID是必须的,可以指定为任意列
Message[] msgs2 = query.GetPage(Message._.ID,10).ToArray(3);
bool exist = query.Exists(Message._.ID == 1);
object obj = query.Where(Message._.ID == 1).Sum(Message._.ID);
版本号:2.1.5
1.新增Union操作及分页处理,进行Union操作的实体同样可以进行分页操作
2.修正关联实体对于多关联在Access中的出错的bug
3.全面修正Access中分页查询的bug
4.修正Join操作中如果用别名,不选择字段出现表名不正确的bug
5.修改EntityDisign中对关联实体中的字段名与属性名不对应的问题
如设计的字段名为{ID},但无法找到此属性名或ID没有用{}括起来,则会报错。
6.修正Oracle、MySql、SQLite、FireBird获取插入数据后获取当前记录号不正确的bug
版本号:2.2.5
1.修正了在项目开发中一些不经常出现的bug
2.批处理中加入返回错误列表
3.增加了自定义表名的处理,很多情况下,表需要做分表处理,以往单一表名的定义
已经不能适应这种情况的处理,所以需要传入表名以操作某一特定的表
下面功能将user实体保存到表UserTest
DbSession.Default.Save<User>(new Table("UserTest"),user);
中间过度版本2.4.0,以下更新将与之前版本不兼容
......
版本号:2.5.0
1.增加了增、删、改、查创建器
QueryCreater 查询创建器
InsertCreator 插入创建器
UpdateCreator 修改创建器
DeleteCreator 删除创建器
2.支持不带泛型的数据库查询方式。
QueryCreator q = QueryCreator.NewCreator()
.From("user")
.AddField("userid")
.AddField("username")
.AddWhere("groupid",1);
DbSession.Default.From(q).ToTable();
DbSession.Default.From(q).ToList<T>();
DbSession.Default.From(q).ToListPage<T>();
3.完美支持Oracle,FireBird,SQLite
4.可以生成不带属性变更的方法,需设置EntityDesignConfig.xml
EnabledPropertyValueChange 为true,则生成,反之不生成
对于多线程操作时,可以选择不生成OnPropertyValueChange方法,可以提高性能
版本号:2.5.6
1.修正了多个主键时使用Get(params object[] pkValues) 会出错的bug;
2.修正了使用Oracle驱动时间格式不是yyyy-MM-dd HH:mm:ss时,查询数据出错的bug;
3.新增新的分布类方式获取数据,如:
系统已经有一个User实体
public partial class User {
public int UserID { get;set;}
public string UserName {get;set;}
}
现在为User扩展一个属性
public partial class User {
public string GroupName {get; private set;} //对外只读
protected override void SetExtValues(ISourceReader reader)
{
if (false == reader.IsDBNull("GroupName"))
{
this.GroupName = reader.GetString("GroupName");
}
}
}
DbSession.Default.From<User>().LeftJoin<Group>(User._.GroupID == Group._.GroupID)
.Select(User._.All,Group._.GroupName).ToList();
这样User就拥有GroupName属性了,而不需要重新设计一个实体
而且多出的属性不会影响到新增与修改操作
版本号:2.5.8
1.增加了ISourceList类,实现了对数据进行分组的功能
ISourceList source = new SourceList(IList<User> list);
source.ToDictionary<int>(User._.GroupID);
或
source.ToDictionary<int>("GroupID");
IArrayList 接口还有若干其它方法
2.强化了内存查询方式
ISourceList source = new SourceList(IList<User> list);
MemoryFrom<User> mf = source.ToMemory();
或
MemoryFrom<User> mf = DbSession.Default.From<User>().ToMemory();
mf.Where(User._.UserID == 1).ToSingle();
mf.Where(User._.GroupID == 1).OrderBy(User._.AddTime.Desc).ToList();
//获取第2页,每页2条
mf.Where(User._.GroupID == 1).GetPage(2).ToList(2);
3.将DataPage修改成DataPage以免与System.Data.DataPage冲突
将ToDataView()方法改为ToListPage()
版本号:2.6.0
1.将WhereClip的生成参数化,彻底解决sql注入的问题
2.强化了QueryCreator的功能
QueryCreator q = QueryCreator.NewCreator()
.From<User>()
.Join<Group>(User._.GroupID == Group._.GroupID)
.AddField(User._.All)
.AddField(Group._.GroupName);
或
QueryCreator q = QueryCreator.NewCreator()
.From("user")
.Join("group","user.groupid = group.groupid")
.AddField("user","*")
.AddField("group","groupname");
DbSession.Default.From(q).ToList<User>();
DbSession.Default.From(q).ToTable();
3.支持表前缀的后期设置
在web项目中添加一个EntityConfig.xml方法,配置如下
<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfPrefixSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PrefixSetting Name="Default" Value="tb_" />
<PrefixSetting Name="EntityNamespace" Value="tb_" />
</ArrayOfPrefixSetting>
Default:如未设置EntityNamespace,则默认使用此前缀
EntityNamespace: 实体程序集命名空间,如Simple.Entity
EntityNamespace可以多个,这样不同的命令空间可以使用不同的前缀
方便解决多个应用程序使用同一数据的问题
版本号:2.6.5
1.修正了复杂条件使用参数化时产生的bug,比如子查询 In(Query),Union联合查询
2.新增MySql驱动,需要加载MySql.Data.dll
3.新增数据类型IArrayList<T> ISourceList<T> ISourceTable,ISourceReader
使用以上几种类型可以大大加强返回的数据可操作性
ISourceReader接口实现了按fieldName,Field来获取数据
IArrayList实现了ToArray方法
ISourceList实现了数据转换ConvertTo方法,ToGroup方法及ToMemory方法
ISourceTable实现了ToList<T>方法及ToMemory方法
Get<T>()方法更改为Single<T>()方法,返回单一实体
ToFirst()方法更改为ToSingle()方法
ToList方法不变,但返回类型为ISourceList
ToDataTable方法更改为ToTable,返回类型为ISourceTable
ToDataReader方法更改为ToReader,返回类型为ISourceReader
4.新增接口编程方法,可以对应用程序进行解耦,使用如下:
public interface IUser {
UserID { get;set;}
UserName {get;set;}
}
public class User : IUser {
public int UserID { get;set;}
public string UserName {get;set;}
}
以下ToList()返回类型ISourceList<T>,可以使用ConvertTo<T>方法进行数据的转换输出
IList<IUser> list = DbSession.Default.From<User>().ToList().ConvertTo<IUser>();
DbSession.Default.Save(IUser as User);
5.新增了DataUtils.ConvertType<T,TOutput>方法,支持字符串数据类型的转换
public class User1 {
public string UserID { get;set;}
public string UserName {get;set;}
public string BornDate { get;set; }
}
public class User2 {
public int UserID { get;set;}
public string UserName {get;set;}
public DateTime BornDate { get;set; }
}
User1 user1 = new User1() { UserID = "1", UserName = "test", BornDate = "2009-09-10" };
User2 user2 = DataUtils.ConvertType<User1,User2>(user1);
版本号:2.6.6
1.优化了Oracle分页数据查询的性能
版本号:2.6.8
1.修正了获取前N条记录时返回结果不正确的bug
.GetTop(5).ToList() 之前返回为全部数据
对Top结构进行了重构,增加了In语法时的Top查询
2.修正了Access驱动分页查询时参数处理错误的bug
3.对Insert,Delete,Update操作内核进行了重要重构
4.新增加了对postgreSQL数据库的支持
版本号:2.7.0
1.增加从ISourceReader输出为List的方法
2.增加了对Oracle系列名称的自定义
public class UserGroupInfo
{
public int UserID { get; private set; }
public string UserName { get; private set; }
public string GroupName { get; private set; }
}
//先返回ISourceReader,然后再返回List;
IList<UserGroupInfo> list = DbSession.Default.From<User>()
.LeftJoin<Group>(User._.GroupID == Group._.GroupID)
.Select(User._.UserID,User._.UserName,Group._.GroupName)
.ToReader() 或者 .ToTable()
.ToList<UserGroupInfo>();
如果输出的列与属性值不能,可以使用MySoft.Data.Design.Mapping进行标注:
如字段名为UserID,属性名称为ID 可以使用如下方式处理
public class UserGroupInfo : IUserGroupInfo
{
[MySoft.Data.Design.Mapping("UserID")]
public int ID { get; private set; }
public string UserName { get; private set; }
public string GroupName { get; private set; }
}
//先返回ISourceReader,然后再返回List;
IList<UserGroupInfo> list = DbSession.Default.From<User>()
.LeftJoin<Group>(User._.GroupID == Group._.GroupID)
.Select(User._.UserID,User._.UserName,Group._.GroupName)
.ToReader() 或者 .ToTable()
.ToList<UserGroupInfo>();
如果此时使用接口
public interface IUserGroupInfo
{
int ID { get; private set; }
string UserName { get; }
string GroupName { get; }
}
可以使用以下方法转换:
IList<IUserGroupInfo> ilist = list.ConvertTo<IUserGroupInfo>();
3.新增对象多属性排序的类
SortComparer<Entity> c = new SortComparer<Entity>(
new SortProperty("PropertyName1").Asc,
new SortProperty("PropertyName2").Desc,
new SortProperty("PropertyName31").Asc);
new List().Sort(c);
版本号:2.7.2
1.修正了Field.IsNull()条件返回错误的bug;
2.修正直接用sql进行查询或操作时,不用参数化值全部变为大写的bug.
之前是为了适应Oracle必须为大写的需求,现在已经修正。
对Oracle进行个别特殊处理即可
3.修正了where条件参数化后无法进行缓存的bug.
之前是用sql进行缓存,而参数化后每次生成的参数名称不相同,导致缓存无效。
解决办法:将参数的值替换成sql中的参数,从而达到sql一致
4.修正了条件为枚举时返回的结果不正确的bug
5.修正了调用CacheOff()与CacheOn()方法出错的bug
下一步开发计划(MySoft.Data v3.0):
1、增加实体验证处理 EntityValidator<T>
2、增加MySoft.Data.Linq驱动