关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)
关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)
目录
1. 业务主键和平台主键
【业务主键】
是指业务资料表的主键,作为其它表的外键使用的字段,如:
- 客户编码:CustomerCode,该字段作为外键在其他表定义,如果销售订单主表。
- 产品编码:StockCode,该字段作为外键在其他表定义,如果采购单明细表。
- 销售订单:SONO,单据号码。在客户对账单资料表定义。
【平台主键】
也称为记录主键,统一使用字段名:isid varchar(50)。CSFramework开发框架所有资料表定义的主键。
特别是业务表存在复合主键的情况下而设计,作为开发框架内部主键,isid字段不在界面显示,不体现报表等特点。
平台主键主要作用:
a) 作为记录的主键使用,如SQL命令:
DELETE FROM tb_MyTable Where isid=@isid
b) 替换复合主键使用(避免多个AND关系的Where条件)
//复合主键使用
DELETE FROM tb_SupplierGoods Where SupplierCode=@SupplierCode AND StockCode=@StockCode;
//记录主键 isid
DELETE FROM tb_SupplierGoods Where isid=@isid
重点:
a) 存在复合主键的资料表必须定义一个平台主键,如:isid varchar(50)。
b) 当资料表只有一个主键时,只要定义业务主键即可,如:SONO。为了统一数据结构,也建议定义isid字段
2. 复合主键简化处理
业务的需要,有些数据表需要定义复合主键,为了使软件设计简单化,SQL关联查询简单化,建议有复合主键的资料表定义一个唯一主键,如 isid,作为平台主键(PK),类型:VARCHAR(32),可以在客户端新增时赋值:
//EF
orderData.isid=IdHelper.GetId();
//ADO.NET
DataRow["isid"]=IdHelper.GetId();
3. isid 字段应用
isid字段是开发框架所有资料表统一定义的字段名,isid 是 Is Identity 的缩写,作为记录主键使用。
isid作为明细表的主键,明细表的外键通常是单据号码,如:SONO, 或主表的isid字段 。
以下情况定义isid为主键
a) 业务主键支持修改的情况下。框架默认业务主键是不可以修改的,如需要修改,必须定义一个isid字段作为数据更新使用,更新时的SQL脚本:
//假设客户编码可以修改,在使用业务主键更新的情况下会报错,因为@CustomerCode是修改后的数据
UPDATE tb_Customer Where CustomerCode=@CustomerCode
//解决方案:
UPDATE tb_Customer Where isid=@isid
如客户资料的业务主键是CustomerCode,界面需要支持修改客户编码,这种情况下必须定义isid为主键。
b) 数据字典的主键。通常数据字典的业务主键是编号,比如货币:CurrencyCode,客户:CustomerCode,单位:UnitCode,同时作为其它业务表的外键关联使用的。这些数据字典可以定义一个isid字段作为数据更新使用的平台主键。
c) 业务单据资料表的主表,可以将业务主键字段名(如:SONO)定义为主键。
4、平台主键isid,业务主键的表结构参考
客户资料
CustomerCode 定义为业务主键
isid 定义唯一索引
对应的 EF实体模型:
[Table("dt_Customer")]
public sealed class dt_Customer
{
[Key, Column(Order = 1)]
public System.String isid { get; set; }
public System.String CustomerCode { get; set; }
public System.String CustomerName { get; set; }
}
销售订单主表
销售订单明细表
EF实体模型统一使用isid作为主键。