实体映射方案,我选择的一种
在写之前,我承认我是个懒人。
现今,分层应用很常见,也少不了数据表与编程语言类/结构的一个映射。
时下很流行反射映射,相比之下省了点事,产生的问题终究要面对的。
如果用传统数据访问层给实体模型赋值,且不论用具体的方法调用。但有一点,通常都是在数据访问层给实体各属性赋值,一有修改,此处必少不了修改。
如果一个项目就几个实体,也就算了。可我还是个懒人。
有没有更灵活的方法,性能上得能去,灵活性又强?
且看我的做法:
声明一个泛型接口 ICreateModel,含方法一个CreateModel,代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
namespace Moli.Framework
{
public interface ICreateModel<TModel>
{
TModel CreateModel(DbDataReader reader);
}
}
建一个抽象实体模型ModelBase,实现此接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data.Common;
namespace Moli.Framework
{
[Serializable]
public abstract class ModelBase<T,TKeys>:ICreateModel<T>
where T:ModelBase<T,TKeys>
{
public ModelBase()
{
}
public TKeys Id { get; set; }
protected abstract T InternalCreateModel(DbDataReader reader);
public T CreateModel(DbDataReader reader)
{
return this.InternalCreateModel(reader);
}
}
}
数据访问层DataAccessBase调用此接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public TModel CreateModel<TModel>(string name,IDictionary<string,object> filter)
where TModel:ICreateModel<TModel>,new()
{
TModel model = new TModel();
this.TryCatch(this.GetDbCommand(name,filter), delegate(DbCommand command)
{
var reader=command.ExecuteReader();
if (reader.Read())
{
model= model.CreateModel(reader);
}
reader.Close();
});
return model;
}
示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Moli.Framework.Test
{
class TestModel:ModelBase<TestModel,string>
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
protected override TestModel InternalCreateModel(System.Data.Common.DbDataReader reader)
{
//整个都可以用工具生成,此法要求数据表列类型,名称对应,当然还有更灵敏写法,
var i = -1;
if (reader.IsDBNull(++i))
{
this.Age = reader.GetInt32(i);
}
if (reader.IsDBNull(++i))
{
this.Name = reader.GetString(i);
}
return this;
}
}
}
以上问题都能很好解决,写的不好请多指教!