关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架
作者:csframework|C/S框架网  发布日期:2024/11/13 15:56:33

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)

1. 业务主键和平台主键

【业务主键】

是指业务资料表的主键,作为其它表的外键使用的字段,如:

  • 客户编码:CustomerCode,该字段作为外键在其他表定义,如果销售订单主表。
  • 产品编码:StockCode,该字段作为外键在其他表定义,如果采购单明细表。
  • 销售订单:SONO,单据号码。在客户对账单资料表定义。

【平台主键】

也称为记录主键,统一使用字段名:isid varchar(50)。CSFramework开发框架所有资料表定义的主键。

特别是业务表存在复合主键的情况下而设计,作为开发框架内部主键,isid字段不在界面显示,不体现报表等特点。

平台主键主要作用:

a) 作为记录的主键使用,如SQL命令:

C# 全选
DELETE FROM tb_MyTable Where isid=@isid

b) 替换复合主键使用(避免多个AND关系的Where条件)

C# 全选
//复合主键使用
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),可以在客户端新增时赋值:

C# 全选
//EF
orderData.isid=IdHelper.GetId();
//ADO.NET
DataRow["isid"]=IdHelper.GetId();

3. isid 字段应用

isid字段是开发框架所有资料表统一定义的字段名,isid 是 Is Identity 的缩写,作为记录主键使用。

isid作为明细表的主键,明细表的外键通常是单据号码,如:SONO, 或主表的isid字段 。

以下情况定义isid为主键

a) 业务主键支持修改的情况下。框架默认业务主键是不可以修改的,如需要修改,必须定义一个isid字段作为数据更新使用,更新时的SQL脚本:

C# 全选
//假设客户编码可以修改,在使用业务主键更新的情况下会报错,因为@CustomerCode是修改后的数据
UPDATE tb_Customer Where CustomerCode=@CustomerCode

//解决方案:
UPDATE tb_Customer Where isid=@isid

如客户资料的业务主键是CustomerCode,界面需要支持修改客户编码,这种情况下必须定义isid为主键。

b) 数据字典的主键。通常数据字典的业务主键是编号,比如货币:CurrencyCode,客户:CustomerCode,单位:UnitCode,同时作为其它业务表的外键关联使用的。这些数据字典可以定义一个isid字段作为数据更新使用的平台主键。

c) 业务单据资料表的主表,可以将业务主键字段名(如:SONO)定义为主键。

4、平台主键isid,业务主键的表结构参考

客户资料

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架

CustomerCode 定义为业务主键

isid 定义唯一索引

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架

对应的 EF实体模型:

C# 全选
    [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; }
    }

销售订单主表

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架

销售订单明细表

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架

重要提示

EF实体模型统一使用isid作为主键。

关于ORM实体类主键设置的几点建议(Tag:复合主键,ISID,PK)|C/S开发框架

C/S框架网|原创精神.创造价值.打造精品



扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇