2016-12-19 16 views
0

複数の連続番号系列を作成したい シリアル番号は次のようになります。 私はその後、私はEntity Frameworkの6.1.3でこれを行うだろうどのように新しいシリアル番号Insertをselect into Entity Framework 6に翻訳

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 [email protected]_id 

を作成するには、このクエリを使用

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] 

EDIT:あなたがしなければならないので、私は、ORMに...あなたはそれをすると仮定しているが、それが悪いと考えられていた場合、誰かが、おそらく私に教えてくれます

答えて

1

コメントの後に編集: DbContextは、SerialNumberテーブルを表すSerialNumbersプロパティで正しく設定する必要があります。私は次のエラーを得ていた

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

これは、Max(Snr)を取得する際にMachineIdが考慮する必要はありませんか? MachineIdごとに1つのセリがあります。 – Andis59

+0

MachineIdごとに1つのSerialNumberがあることを正しく理解していますか?もしそうなら、MAXの意味は何ですか?投稿したコードは、MachineIdに関係なく、db内のすべてのSerialNumberエントリの最大Snrを取得します。 – GDS

+0

質問を編集しましたが、はい、シリアル番号シリーズがマシンごとに1つあり、そのシリーズの最大値を取得する必要があります。 – Andis59

2

Entity Frameworkはそれを知らない、全体の質問を書き直し次のように、データベースへのオブジェクトとのリンクを作成します。

あなたはする必要があります。

  • はunderlyngデータベーステーブル
  • SerialNumber
  • マップという名前のクラスを持っています
  • あなたがEntity Frameworkのを使用するためのガイドを見つけることができますDBContext

Hereであなたのオブジェクトを永続化します。

0

:値型へのキャストを「のInt32を

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 
} 

、その後、これに似たいくつかのコードは、ジョブを実行する必要があります。SerialNumberオブジェクトは、次のクラスで表現されています'は実体化された値がnullのために失敗しました

selectが0行を見つけてヌル値を返すとき、GDSのコードを次のように変更しました。

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