我想创建多个序列号系列 序列号看起来像 - e.g。
M1-00000001 M2-00000001 M1-00000002 M3-00000001 M2-00000002 ......
CREATE TABLE [dbo].[SerialNumber](
[Id] [int] NOT NULL,
[MachineId] [nchar](10) NOT NULL,
[Snr] [int] NOT NULL,
CONSTRAINT [PK_SerialNumber] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
然后我使用此查询创建新的序列号
DECLARE @machine_id AS NCHAR(10)
SET @machine_id = 'M2'
INSERT INTO SerialNumber (MachineId,Snr)
SELECT @machine_id ,IIF(MAX(Snr) is not null,MAX(SNR)+1,1)
from SerialNumber
where MachineId=@machine_id
我将如何在Entity Framework 6.1.3中执行此操作?
编辑:我重写了整个问题,不知道你是不是想这样做,但有人可能会告诉我它是否被认为是坏事......答案 0 :(得分:2)
ORM中的实体框架,因此您必须创建一个对象并链接到您的数据库,如下所示:
你必须:
SerialNumber
DBContext
Here您可以找到使用Entity Framework的指南。
答案 1 :(得分:2)
评论后编辑:
这需要使用表示SerialNumber表的DbContext
属性正确设置SerialNumbers
。 SerialNumber
个对象由以下类表示:
public class SerialNumber
{
public int Id {get;set;} //Added after edit
public string MachineId {get;set;}
public int Snr {get;set;} //I assume it is a nullable int
}
然后一些类似的代码应该完成这项工作:
public void AddSerial(string machineId)
{
using (var context = new MyDbContext())
{
int max = context.SerialNumbers
.Where(sn => sn.MachineId == machineId)
.Select(sn => sn.Snr)
.DefaultIfEmpty(0)
.Max(); //Extra clauses added after edit
max++;
context.SerialNumbers.Add(new SerialNumber{ MachineId = machineId, Snr = max});
context.SaveChanges();
}
}
答案 2 :(得分:0)
我收到以下错误:转换为值类型'Int32'失败,因为具体化值为null
我将GDS的代码更改为以下内容,以便在select找到0行并返回空值时进行处理。
public void AddSerial(string machineId)
{
using (var context = new MyDbContext())
{
int max = context.SerialNumbers
.Where(sn => sn.MachineId == machineId)
.Max(sn =>(int?)sn.Snr) ?? 0; //Extra clauses added after edit
max++;
context.SerialNumbers.Add(new SerialNumber{ MachineId = machineId, Snr = max});
context.SaveChanges();
}
}