将Insert转换为select to Entity Framework 6

时间:2016-12-19 11:26:17

标签: c# sql sql-server entity-framework entity-framework-6

我想创建多个序列号系列 序列号看起来像 - 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中执行此操作?

编辑:我重写了整个问题,不知道你是不是想这样做,但有人可能会告诉我它是否被认为是坏事......

3 个答案:

答案 0 :(得分:2)

ORM中的实体框架,因此您必须创建一个对象并链接到您的数据库,如下所示:

你必须:

  • 有一个名为SerialNumber
  • 的班级
  • 使用underlyng数据库表进行映射
  • 将您的对象保留在DBContext

Here您可以找到使用Entity Framework的指南。

答案 1 :(得分:2)

评论后编辑: 这需要使用表示SerialNumber表的DbContext属性正确设置SerialNumbersSerialNumber个对象由以下类表示:

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();
    }
}