LSFrameWork Demo.P1
经过几天晚上的努力,终于都写了一个简单的DEMO,可谓是困难重重,毕竟本人对UI简直是白痴!(题外话)
今天来个DEMO总括根据该DEMO一步一步解释整个框架的设计方案与使用规则。
下面我们先来看看DEMO的模拟需求:
1、模拟一张单,该单需要运到到某一步都有相应的状态来标识,然而用户的每个操作也有相应的操作记录。
2、每张单包括单号、客单号、明细(款式、色号、尺玛)。
3、明细要求款式、尺码不能为空。
界面/流程图(下图中每按钮代表该单的一个状态):

数据库ERD:

在上面的数据库ERD图中,OrderVersionStateMaster,OrderVersionOperationManager 两个表中的数据都为源数据,充当关系表的外键标识。然而在OrderHeader, OrderHeaderMaster 当中,OrderHeaderMaster 里的数据都为用户输入的数据,所以 OrderHeader 里的数据与 OrderHeaderMaster 完全产生于动态。
有了以上的需求与数据库设计之后,下面接着介绍DAO层逻辑,我们先由DAO类布局开始结构,看一下它与数据库ERD有什么不同。
与ERD相比,只是在关系上多了集合类而已。对,DAO设计就应该这样!这样一来当我们设计访问层的时候直接(在实际中可能有小小不相符)从DAO设计搬过来,从而达到设计重用。因为在某些程度上数据库结构可能很容易就到了一个不够用的状态,如果数据访问层设计与DAO设计基本上一致的话那么DAO层后部维护成本完全可以降低!那当然,类的多少还要看业务层调用的复杂度,最终需要DAO使用粒度而决定。
数据对象解释:OrderVersionDao
[RowUpdate(Program.DBName, "uOrderVersionManager", Level = 0)] //修改行标签
[RowDelete(Program.DBName, "dOrderVersionManager", Level = 0, IsDeleteChild = false)] //删除行标签
public class OrderVersionDao : DataClassBasic
{
[ColumnPrimaryKey]
[ColumnField("ID", DataType.Guid)]
private Guid _ID = GuidManager.NewGuid();
public Guid ID
{
get
{
return _ID;
}
set
{
if (_ID != value)
{
_ID = value;
MarkChanged();
}
}
}
[ColumnParentKey] //父键/外键标识,在本ORM中一个表只能有一个外键.
[ColumnField("OrderID", DataType.Guid)]
private Guid _ParentID = GuidManager.Empty;
[ColumnField("VersionNr", DataType.Number)]
private Int32 _VersionNr = 0;
public Int32 VersionNr
{
get
{
return _VersionNr;
}
set
{
if (_VersionNr != value)
{
_VersionNr = value;
MarkChanged();
}
}
}
[TableChildList]
private OrderVersionHeaderRelationColDao _HeaderCol = new OrderVersionHeaderRelationColDao();
public OrderVersionHeaderRelationColDao HeaderCol
{
get
{
return _HeaderCol;
}
}
[TableChildList]
private OrderVersionLineItemColDao _LineItemCol = new OrderVersionLineItemColDao();
public OrderVersionLineItemColDao LineItemCol
{
get
{
return _LineItemCol;
}
}
[TableChildList]
private OrderVersionStateColDao _StateCol = new OrderVersionStateColDao();
public OrderVersionStateColDao StateCol
{
get
{
return _StateCol;
}
}
[TableChildList]
private OrderVersionOperationColDao _OperationCol = new OrderVersionOperationColDao();
public OrderVersionOperationColDao OperationCol
{
get
{
return _OperationCol;
}
}
internal void MapData(SimpleDataRow row, SimpleDataTableCol tables)
{
_ID = row.GetColumn("ID").GetGuid(Guid.Empty);
_ParentID = row.GetColumn("OrderID").GetGuid(Guid.Empty);
_VersionNr = row.GetColumn("VersionNr").GetInt(0);
foreach (SimpleDataRow srow in tables.GetTable(2).GetRows())
{
if (srow.GetColumn("OrderVersionManagerID").GetGuid(Guid.Empty) == _ID)
{
OrderVersionHeaderRelationDao header = new OrderVersionHeaderRelationDao();
header.MapData(srow);
_HeaderCol.Add(header);
}
}
foreach (SimpleDataRow srow in tables.GetTable(3).GetRows())
{
if (srow.GetColumn("OrderVersionManagerID").GetGuid(Guid.Empty) == _ID)
{
OrderVersionLineItemDao lineitem = new OrderVersionLineItemDao();
lineitem.MapData(srow);
_LineItemCol.Add(lineitem);
}
}
foreach (SimpleDataRow srow in tables.GetTable(4).GetRows())
{
if (srow.GetColumn("OrderVersionManagerID").GetGuid(Guid.Empty) == _ID)
{
OrderVersionStateDao state = new OrderVersionStateDao();
state.MapData(srow);
_StateCol.Add(state);
}
}
foreach (SimpleDataRow srow in tables.GetTable(5).GetRows())
{
if (srow.GetColumn("OrderVersionManagerID").GetGuid(Guid.Empty) == _ID)
{
OrderVersionOperationDao operation = new OrderVersionOperationDao();
operation.MapData(srow);
_OperationCol.Add(operation);
}
}
}
}
public class OrderVersionColDao : DataClassBasicCol<OrderVersionDao>
{
public OrderVersionColDao()
{
}
public OrderVersionDao GetVersion(int versionNr)
{
foreach (OrderVersionDao item in this)
{
if (item.VersionNr == versionNr)
{
return item;
}
}
throw new Exception("找不到相应版本异常!");
}
}
RowInsert:数据行插入时使用的存储过程,可以有多个,但数据库逻辑名称不能重复。
RowUpdate:数据行更新时使用的存储过程,可以有多个,但数据库逻辑名称不能重复。
RowDelete:数据行删除时使用的存储过程,可以有多个,但数据库逻辑名称不能重复。
RowInsert.Level/RowUpdate.Level/RowDelete.Level:同为执行等级,该等级为批处理时等级,在批处理时框架根据等级从小到大执行,如果等级相同则为先入先出为条件来执行。
RowInsert.ExtendFieldNames/RowUpdate.ExtendFieldNames/RowDelete.ExtendFieldNames:同为扩展字段名称,多名称用豆号区分。如果本属性为"Null"则抛出异常。如果本属性不为空字符串则系统会自动以扩展属性为表准来执行相应存储过程(不会再自动搜索所需要的字段,而直接使用该属性中提供的字段)。
RowDelete.IsDeleteChild:该属性为当执行本存储过程时时候继续执行本对象的子对象/子集合对象的删除存储过程。因为在某些时候我们删除一个对象的时候在存储过程可以连同该关系的子关系表数据也一同删除。
ColumnPrimaryKey:代表着对象主键的标识,一个对象中有且只能有一个该标签,否则会抛出异常。
ColumnField:代表着数据表中的字段(列)名称或存储过程参数名称。如为SqlServer 则抛弃"@"符号。
ColumnParentKey: 代表着父对象外键标识,一个对象有且只能有一个该标签,如一个表多个父对象外键标识。如需要多个父层外键标识则应该使DAO设计适应。
TableChildList:子集合标识。
类型说明:
单一对象必须继承:DataClassBasic
集合对象必须继承:DataClassBasicCol<T>
今天就介绍到这里,下面提供DEMO的下载连接。如有不明白或检测出漏洞欢迎Q ME,MYQQ:290535054,或加入群:35392104 让我们一起成长。
下载连接(内数据库):Demo
浙公网安备 33010602011771号