以下全部都是本人使用感觉:如有错误,等等请留言。咱共同进步
特点:易于维护,层次分明。重用性高。
不足:不灵活。好麻烦。报错不完整。(对于刚上手的我来说)
针对我们原来的模块功能。因为需求的增加和变更。原来的简单3层越来越臃肿。庞大。特使用此框架重写。
整个框架包括4大部分:
1.业务 Business
- 数据访问层 DataAccess(数据库操作。调用框架自带方法。及配置连接字符串等)
- 基础层(?)BusinessRule(我一直没用到。。只是调用上层的方法)
- 业务逻辑层 BusinessFacade(业务处理。比如不同的实体转换等)
- 服务层Service(供页面直接调用的)
- 本来还有一层接口层的。应用于不同需要重写方法。好像被阉割了。
2.资源 Resource
- 第三方类库等 DLL文件夹
- 其他如图片等
3.显示 UI
- 网站
- 网站自定义空间
- web service
- 接口其他?
4.工具 Common
- 自己写的工具类库
为什么我说感觉不灵活呢。
因为对于数据库的操作由原来的自己写SQL语句变为了使用框架自带的方法。(一部分没用用到。看方法传参等感觉还是可以实现自己写SQL的。以待以后挖掘。)
对于复杂的语句就不好操作了。不过却规范化了代码。不会出现一个sql语句一整个页面。或者几个页面。很复杂。
以下为自带的对数据库操作的接口。
public class BaseBLL<T> where T : new()
{
public BaseDal baseDal;
public BaseBLL(string _TableName, string _OrderByField, string _PrimaryKey);
public DBResult AddRecord(EntityObject entity);
public void AttachAddRecord(EntityObject objects);
public void AttachDeleteRecord(EntityObject objects);
public void AttachUpdateRecord(EntityObject objects);
public EntityConnection BuildConnection(Assembly _Assembly, string ip, string uid, string upwd, string db);
public DBResult DeleteRecord(EntityObject entity);
public DBResult DeleteRecord(EntityObject objects, List<string> Include);
public DBResult<EntityObject> GetCurObject(EntityObject obj);
public DBResult<EntityObject> GetObject(List<string> Include, List<WhereParameter> parameters);
public DBResult<List<EntityObject>> QueryListRecordGroup(List<WhereParameter> ListWhere);
public DBResult<List<EntityObject>> QueryListRecordGroup(List<WhereParameter> ListWhere, List<string> Include);
public DBResult<List<EntityObject>> QueryListRecordGroup(List<WhereParameter> ListWhere, int CurrentPage, int PageCount, ref int RowCount);
public DBResult<List<EntityObject>> QueryListRecordGroup(List<WhereParameter> ListWhere, List<string> Include, int CurrentPage, int PageCount, ref int RowCount);
public DBResult<List<EntityObject>> QueryListRecordGroup(List<WhereParameter> ListWhere, List<string> Include, List<OrderParameter> ListOrder, int CurrentPage, int PageCount, ref int RowCount);
public DBResult<List<DbDataRecord>> QueryListRecordGroupExtend(string strSql, List<ObjectParameter> parameters, List<OrderParameter> orderParameters);
public DBResult<List<DbDataRecord>> QueryListRecordGroupExtend(string strSql, List<ObjectParameter> parameters, List<OrderParameter> orderParameters, int StartIndex, int PageCount, ref int RowCount);
public EntityObject QuerySingleRecord(Guid ID);
public EntityObject QuerySingleRecord(int ID);
public EntityObject QuerySingleRecord(string ID);
public DBResult SaveChanges();
public DBResult UpdateRecord(EntityObject entity);
}
对于数据库的实体则是采用ADO.NET实体模型。
以上为简单介绍。
下面是关于使用中遇到的问题及解决办法。(很多很2- -...)
首先是查询一张表所有数据空异常。
其次还是查询一张表所有数据空异常。
只有还是查询一张表所有数据空异常。
我晕死。他只会包这一个错么?这就是开头我说的报错不完整了。不知道是不是我的姿势错误的原因。
首先是检查主键。我们一般使用临时表的放置被抽取或者要处理的数据,被实体化的表发现没有主键。会发现以上问题。
其次是组合主键。当使用视图为数据源时。可能是创建视图的语句问题。会有多个组合主键。可能会冲突。需要手动去EDMX文件的从元数据里自己去改反射的特性。
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int32 FlagIdentity
{
get
{
return _FlagIdentity;
}
set
{
if (_FlagIdentity != value)
{
OnFlagIdentityChanging(value);
ReportPropertyChanging("FlagIdentity");
_FlagIdentity = StructuralObject.SetValidValue(value);
ReportPropertyChanged("FlagIdentity");
OnFlagIdentityChanged();
}
}
}
EntityKeyProperty为主键属性。这个害惨我了。。
之后就是数据重复问题。也是因为主键问题。
数据库没有设主键但是。对实体类手动修改了。
导致查找出来的数据一堆一堆的的重复问题。
最后给数据库增加了一个自增列。
问题2:
各实体之类设置外键。失败。
很多因为是临时表我们可以控制。
问题是。数据源等等是已经用了很多年并且设计好的数据库了。要使用外键等功能并不现实。不能容错。且数据源历史数据可能本身就存在出入不可避免。外键等使用失败。
问题3:
当不在自己写SQL时使用框架。where 条件全使用
List<WhereParameter> ListWhere
参数配置。一开始也被坑的好惨。
因为他的每个参数都必须严格符合数据库的类型。否则就报。。。。空异常!!没看错。又是空异常。让我找BUG变成找BUG死。。。
程序直接生成时并不告诉我有什么错误。
还有碰到的问题...零零碎碎也想不起来了。
暂时就写到这。