PetaPOCO使用(四)——Identity 和Primary Key

在设计数据库表时,经常使用标识类型的字段作为主关键字,比如,在SqlServer中,可以将主关键字字段设置为IDEMTITY,这样在插入时,由数据库自动产生字段的值,这种设计方式,满足大多数的应用场景。可是在某些情况下,我们希望自行定义主关键字字段,但同时使用一个Identity字段产生数字序列,最近遇到的一个实例是:在保存工作流实例时,希望使用由工作流引擎产生的Guid作为主关键字,但同时为了将来访问方便,需要有一个数字序列,表的定义如下:

CREATE TABLE [dbo].[ZL_FlowInstance_TB](
    [SerialNumber] [int] IDENTITY(1,1) NOT NULL,
    [InstanceId] [nvarchar](200)  NOT NULL,
    [DefineName][nvarchar](400) NOT NULL,
    [Version][nvarchar](400) NOT NULL,
    [CurrentState][nvarchar](400) NOT NULL,
    [Status]  [int] NOT NULL,
    [LastExecuteTime] [datetime] NOT NULL,
 CONSTRAINT [PK_ZL_FlowInstance_TB] PRIMARY KEY CLUSTERED 
(
    [InstanceId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] 

这里字段SerialNumber是自动增加的IDENTITY字段,InstanceId是Primary Key。我们使用PetaPOCO定义如下:

using PetaPoco;
using System;
using System.Collections.Generic;
using System.Text;
using ZL.Workflow.Record;

namespace ZL.WorkFlow.DB.Entries
{
    [TableName("ZL_FlowInstance_TB")]
    [PrimaryKey("InstanceId", AutoIncrement = false)]
    public class FlowInstanceInfo:InstanceInfo
    {
        /// 
        /// 自动生成的流水号
        /// 
        [Column]
        public int SerialNumber { get; set; }
       [Column]
        public override string InstanceId { get => base.InstanceId; set => base.InstanceId = value; }
        [Column]
        public override string DefineName { get => base.DefineName; set => base.DefineName = value; }
        [Column]
        public override string Version { get => base.Version; set => base.Version = value; }
        [Column]
        public override string CurrentState { get => base.CurrentState; set => base.CurrentState = value; }
        [Column]
        public override int Status { get => base.Status; set => base.Status = value; }
        [Column]
        public override DateTime LastExecuteTime { get => base.LastExecuteTime; set => base.LastExecuteTime = value; }
    }
}

当插入记录时,发生错误"当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'ZL_FlowInstance_TB' 中的标识列插入显式值",数据库不允许为IDENTITY字段插入值,这种情况下,需要在执行Insert和Update时,将IDENTITY字段排除,在PetaPOCO中,可以使用[ResultColumn]实现这个目的。

        /// 
        /// 自动生成的流水号
        /// 
        [ResultColumn]
        public int SerialNumber { get; set; }

标记有[ResultColumn]的字段,不参与Insert和Update,只在Query中出现。

你可能感兴趣的:(PetaPOCO使用(四)——Identity 和Primary Key)