【问题标题】:Translating Insert into select to Entity Framework 6将插入转换为选择实体框架 6
【发布时间】:2016-12-19 11:26:16
【问题描述】:

我想创建多个序列号系列 序列号看起来像 - 例如

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 中执行此操作?

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

【问题讨论】:

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


    【解决方案1】:

    在 cmets 之后编辑: 这需要使用代表 SerialNumber 表的 SerialNumbers 属性正确设置 DbContext。 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();
        }
    }
    

    【讨论】:

    • 这在获取 Max(Snr) 时没有考虑 MachineId 吗?每个 MachineId 有一个系列。
    • 我是否正确理解每个 MachineId 有一个 SerialNumber?如果是这样,MAX是什么意思?我发布的代码检索数据库中所有 SerialNumber 条目的最大 Snr,而不管 MachineId。
    • 我已经编辑了这个问题,但是是的,每台机器都有一个序列号系列,我需要获得该系列的最大值。
    • 完美运行!非常感谢!
    【解决方案2】:

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

    你必须:

    • 有一个名为SerialNumber的类
    • 与基础数据库表映射
    • 将您的对象保存在DBContext

    Here你可以找到使用实体框架的指南。

    【讨论】:

      【解决方案3】:

      我收到以下错误:转换为值类型“Int32”失败,因为具体化值为空

      我将 GDS 的代码更改为以下代码,以便在 select 找到 0 行并返回 null 值时进行处理。

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

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多