2016-10-21 15 views
0

2つのテーブルにデータを挿入する際に問題が発生しています。 次のように私は2つの異なる手順を作成しました:-Hereが最初の手順ですEntity Framework:データリーダーが指定された「NPAModel.NPAAddApplication」と互換性がありません。

CREATE PROCEDURE [dbo].[NPAAddApplicant] 

     @szName varchar(100), 
     @szCompPostalAdd varchar(200), 
     @szCompStreet varchar(200), 
     @szCompTel1 varchar(100), 
     @szCompTel2 varchar(50), 
     @szFax varchar(50), 
     @szCompEmailAdd varchar(50), 
     @szCompWebSite varchar(100), 
     @szContPersonName varchar(200), 
     @szContactPhone1 varchar(50), 
     @szContactPhone2 varchar(50), 
     @szContactPhone3 varchar(50), 
     @szContEmail varchar(50), 
     @iUserId bigint, 
     @iStatus int, 
     @iConcurrency int, 
     @iCompanyId bigint, 
     @szType varchar(50), 
     @szContactDesignation varchar(150), 
     @szCertificateOfIncorporation varchar(50), 
     @iTypeOfBunkering int, 
     @iZoneId bigint, 
     @dLicenseDate date, 
     @szImlBpCode varchar(50), 
     @iTownId bigint, 
     @iNewApplicant bigint 

AS 

BEGIN 

declare @szCode varchar(25) 
EXEC spGenTransCode @szType, @retval = @szCode OUTPUT 

INSERT INTO psApplicant 
     (szCode,szName,szCompPostalAdd,szCompStreet,szCompTel1,szCompTel2,szFax,szCompEmailAdd,szCompWebSite,szContPersonName,   
     szContactPhone1,szContactPhone2,szContactPhone3,szContEmail,iUserId,iStatus,iConcurrency,iCompanyId,szType,szContactDesignation, 
     szCertificateOfIncorporation,dStampDate,dCreatedate,iTypeOfBunkering,iZoneId,dLicenseDate,szImlBpCode,iTownId,iNewApplicant) 
VALUES 
     (@szCode, @szName, @szCompPostalAdd, @szCompStreet, @szCompTel1, @szCompTel2, @szFax, @szCompEmailAdd, @szCompWebSite, 
     @szContPersonName, @szContactPhone1, @szContactPhone2, @szContactPhone3, @szContEmail, @iUserId, @iStatus, @iConcurrency, 
     @iCompanyId, @szType, @szContactDesignation, @szCertificateOfIncorporation, GETDATE(), GETDATE(), @iTypeOfBunkering, 
     @iZoneId, @dLicenseDate, @szImlBpCode, @iTownId,@iNewApplicant) 

SELECT SCOPE_IDENTITY() AS NewApplicant; 
END 

-Hereは、2番目の手順です:

CREATE PROC [dbo].[NPAAddApplication] 

@iApplicantId bigint, 
@iStageId bigint, 
@iApplicationTypeId bigint, 
@iUserId bigint, 
@szTransId varchar(25) 


AS 

BEGIN 

    EXEC spGenTransCode 'APP', @retval = @szTransId OUTPUT 

    INSERT INTO [dbo].[psApplication] 
    (
     iApplicantId, 
     dAppdate, 
     iStageId, 
     dStampdate, 
     iApplicationTypeId, 
     iUserId, 
     szTransId 
    ) 

    VALUES 
    (
     @iApplicantId, 
     GETDATE(), 
     1, 
     GETDATE(), 
     @iApplicationTypeId, 
     @iUserId, 
     @szTransId 
    ) 



    SELECT @szTransId as NewApplicationTransaction 

END 

今、私は、Web API POSTメソッドを持っていますpsApplicationとpsApplicationの両方のテーブルに同時にデータをロードするのに役立ちますが、psApplicationテーブルのiApplicantIdは自動的にpsApplicantテーブルのpkIdを選択します。正しい。次のように APIの私のC#のコードは次のとおりです。

public long PostApplicants(mApplicant applicanto) 
    { 
     mApplicant newApplicant = new mApplicant(); 

     newApplicant.szName = applicanto.szName; 
     newApplicant.szCode = applicanto.szCode; 
     newApplicant.szCompPostalAdd = applicanto.szCompPostalAdd; 
     newApplicant.szCompStreet = applicanto.szCompStreet; 
     newApplicant.szCompTel1 = applicanto.szCompTel1; 
     newApplicant.szCompTel2 = applicanto.szCompTel2; 
     newApplicant.szFax = applicanto.szFax; 
     newApplicant.szCompEmailAdd = applicanto.szCompEmailAdd; 
     newApplicant.szCompWebSite = applicanto.szCompWebSite; 
     newApplicant.szContPersonName = applicanto.szContPersonName; 
     newApplicant.szContactPhone1 = applicanto.szContactPhone1; 
     newApplicant.szContactPhone2 = applicanto.szContactPhone2; 
     newApplicant.szContactPhone3 = applicanto.szContactPhone3; 
     newApplicant.szContEmail = applicanto.szContEmail; 
     newApplicant.iUserId = applicanto.iUserId; 
     newApplicant.iStatus = applicanto.iStatus; 
     newApplicant.iConcurrency = applicanto.iConcurrency; 
     newApplicant.iCompanyId = applicanto.iCompanyId; 
     newApplicant.szType = applicanto.szType; 
     newApplicant.szContactDesignation = applicanto.szContactDesignation; 
     newApplicant.szCertificateOfIncorporation = applicanto.szCertificateOfIncorporation; 
     newApplicant.iTypeOfBunkering = applicanto.iTypeOfBunkering; 
     newApplicant.iZoneId = applicanto.iZoneId; 
     newApplicant.dLicenseDate = applicanto.dLicenseDate; 
     newApplicant.szImlBpCode = applicanto.szImlBpCode; 
     newApplicant.iTownId = applicanto.iTownId; 
     newApplicant.iNewApplicant = applicanto.iNewApplicant; 

     var ObjApplicant = applicanto.MyApplications as List<mApplications>; 

     try 
     { 
      NPAEntities contextApp = new NPAEntities(); 

      var newCrit = contextApp.NPAAddApplicant(newApplicant.szName, newApplicant.szCompPostalAdd, newApplicant.szCompStreet, 
            newApplicant.szCompTel1, newApplicant.szCompTel2, newApplicant.szFax, newApplicant.szCompEmailAdd, newApplicant.szCompWebSite, 
            newApplicant.szContPersonName, newApplicant.szContactPhone1, newApplicant.szContactPhone2, newApplicant.szContactPhone3, 
            newApplicant.szContEmail, newApplicant.iUserId, newApplicant.iStatus, newApplicant.iConcurrency, newApplicant.iCompanyId, 
            newApplicant.szType, newApplicant.szContactDesignation, newApplicant.szCertificateOfIncorporation, newApplicant.iTypeOfBunkering, 
            newApplicant.iZoneId, newApplicant.dLicenseDate, newApplicant.szImlBpCode, newApplicant.iTownId, newApplicant.iNewApplicant).FirstOrDefault(); 

      int retPkid = Convert.ToInt16(newCrit.NewApplicant); 

      int pkid = Convert.ToInt32(retPkid); 

      string tblName = "psApplicant"; 

      if (pkid > 0) 
      { 
       try 
       { 
        foreach (mApplications applicats in ObjApplicant) 
        { 
         mApplications newAppls = new mApplications(); 

         newAppls.pkId = applicats.pkId; 
         newAppls.iApplicantId = pkid; 
         newAppls.iStageId = applicats.iStageId; 
         newAppls.iApplicationTypeId = applicats.iApplicationTypeId; 
         newAppls.iUserId = applicats.iUserId; 
         newAppls.szTransId = applicats.szTransId; 

         NPAEntities context2 = new NPAEntities(); 

         var ret = context2.NPAAddApplication(newAppls.iApplicantId, newAppls.iStageId, 
           newAppls.iApplicationTypeId, newAppls.iUserId, newAppls.szTransId); 
        } 

        return ObjApplicant.Count(); 
       } 
       catch (Exception ex) 
       { 
        NPAEntities context = new NPAEntities(); 
        **context.NPAGenericDeleteValue(tblName, pkid);** 
        return -1; 
       } 
      } 
     } 
     catch (Exception) 
     { 
      return -1; 
     } 
     return ObjApplicant.Count(); 
    } 

私は、Web APIの闊歩を使用しています。私はそれを実行すると、最初のテーブルが移入されているし、2番目のテーブルが移入されていません。私は、次のコード行にブレークポイントを入れて、もう一度コードを実行しますと言っ

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<NPAAddApplication>("NPAAddApplication", iApplicantIdParameter, iStageIdParameter, iApplicationTypeIdParameter, iUserIdParameter, szTransIdParameter); 

{ "データを

var ret = context2.NPAAddApplication(newAppls.iApplicantId, newAppls.iStageId, 
           newAppls.iApplicationTypeId, newAppls.iUserId, newAppls.szTransId); 

は、今私はここにエラーが発生しましたリーダーが指定された 'NPAModel.NPAAddApplication'と互換性がありません。 'NewApplicationTransaction'タイプのメンバーに、同じ名前のデータリーダーに対応する 列がありません。 "}

応答体である-1と応答コードが200

通常応答本体が1であるべきであり、応答コードが200

次の行でありますのコードは、2番目の挿入ステートメントでエラーが発生した場合、最初のテーブルにデータが保存されないようにするものです。

context.NPAGenericDeleteValue(tblName, pkid); 
その行をコメントアウト

はレスポンスボディで両方のテーブルのデータを保存します-1と応答コードが200

だから、それについてどんな考えですか?

+0

申し訳ありませんが、私は言及するのを忘れてしまったことがあります。そのpkIdにpsApplicationTypeという別のテーブルがあります。したがって、渡されたiApplicationTypeIdがpsApplicationTypeテーブルに存在しない場合、すべて正常に動作します。レスポンスボディ1とレスポンスコード200です。しかし、それ以外の場合は、レスポンスボディ-1とレスポンスコード200が返されます。 – Somad

答えて

0

これは、ストアドプロシージャによって返される列の名前を変更して、クラスを元に戻すクラスの名前と一致させる必要があるためです。マッピングを使用しません。

関連する問題