2014-10-10 31 views
0

我有一個名爲CreatePrice的存儲過程,並將它添加到edmx文件(數據庫優先),我可以在模型瀏覽器的函數導入下看到它,並且都很好。生成的功能如下:具有不同返回類型的實體框架數據庫第一個存儲過程

public virtual ObjectResult<CreatePrice_Result> CreatePrice(string type, string code, string userName, Nullable<bool> export) 
{ 
    var typeParameter = type != null ? 
     new ObjectParameter("Type", type) : 
     new ObjectParameter("Type", typeof(string)); 

    var codeParameter = code != null ? 
     new ObjectParameter("Code", code) : 
     new ObjectParameter("Code", typeof(string)); 

    var userNameParameter = userName != null ? 
     new ObjectParameter("UserName", userName) : 
     new ObjectParameter("UserName", typeof(string)); 

    var exportParameter = export.HasValue ? 
     new ObjectParameter("Export", export) : 
     new ObjectParameter("Export", typeof(bool)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CreatePrice_Result>("CreatePrice", typeParameter, codeParameter, userNameParameter, exportParameter); 
} 

返回類型是這樣的:

public partial class CreatePrice_Result 
{ 
    public string ActiveDate { get; set; } 
    public string ActiveTime { get; set; } 
    public string InactiveDate { get; set; } 
    public string InactiveTime { get; set; } 
} 

這是我的問題就在DB管理員誰創建的存儲過程,如果返回一個結果的「。導出「參數設置爲true,並且如果」導出「參數設置爲false,則返回0值。生成的代碼似乎無法理解這一點。

如果我執行存儲過程並將該值設置爲false。我得到這個錯誤:

System.Data.Entity.Core.EntityCommandExecutionException: The data reader is incompatible with the specified 'CreatePrice_Result'. A member of the type, 'ActiveDate', does not have a corresponding column in the data reader with the same name.

我想以最簡單的做法是要求數據庫管理員修改存儲過程返回無論設置出口值的結果,但這違背了這樣的說法,因爲點如果它設置爲false,我不需要它。

有沒有一種方法可以讓我生成的代碼來處理這兩種情況,即處理兩種返回類型。另外,我試圖避免生成的代碼中的手動更改,因爲它被覆蓋。

我試圖改變返回類型爲對象,並試圖返回基於「出口」的說法

if (export == null || export == false) 
{ 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("CreatePrice", typeParameter, codeParameter, userNameParameter, exportParameter); 
} 
else 
{ 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CreatePrice_Result>("CreatePrice", typeParameter, codeParameter, userNameParameter, exportParameter);  
} 

不同的結果,但我得到這個錯誤:

The type parameter 'System.Int32' in ExecuteFunction is incompatible with the type 'CreatePrice_Result' returned by the function.

感謝

+0

如果出口是假的,你不會在所有調用SP? – artm 2014-10-10 12:13:19

+0

@artm存儲過程在兩種情況下執行(它填充其他表),唯一的區別是如果導出爲true,則返回該信息的結果集,如果它設置爲false,則返回0 – mjroodt 2014-10-10 12:18:51

+0

我只看了一下但找不到關於返回多種返回類型的同一個SP的任何內容。不理想,但我能想到的是,如果導出是錯誤的,請嘗試一下。其他解決方案是要求數據庫管理員返回NULL NULL AS ActiveDate,NULL AS ActiveTime ...' – artm 2014-10-10 12:27:22

回答

1

我不相信這可以不訴諸ADO.NET對象。但是,您可以使用ObjectContext.Translate<TElement>方法將結果映射到實體對象,並可以選擇跟蹤實體集中的結果。下面的演示代碼:

SQL存儲過程:

create proc dbo.FuzzyResultSet 
(
    @mode int 
) 
as 

if(@mode = 1) 
begin 
    -- execute non-query 
    return @mode 
end 
else if(@mode = 2) 
begin 
    -- execute scalar 
    select @mode 
end 
else 
begin 
    -- execute reader 
    select * from dbo.Watches 
end 

C#代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using(var db = new DBFirst.EFMREntities()) 
     { 
      db.Database.Initialize(force: false); 

      try 
      { 
       db.Database.Connection.Open(); 

       var objContext = (db as IObjectContextAdapter).ObjectContext; 

       // mode 0 returns a result set 
       var reader = GetCmd(db, 0).ExecuteReader(); 
       var entityResults = objContext 
        .Translate<DBFirst.Watch>(reader, 
         // next two parms only if you want results in an entity set 
         "Watches", MergeOption.OverwriteChanges); 

       // mode 2 returns a scalar 
       var scalarResult = GetCmd(db, 2).ExecuteScalar(); 

       // mode 1 does not return a result set 
       var cmd = GetCmd(db, 1); 
       var nonQueryResult = cmd.ExecuteNonQuery(); 
       var nonQueryReturnParm = cmd.Parameters[ "@RETURN_VALUE" ]; 
       var nqrpValue = Convert.IsDBNull(nonQueryReturnParm.Value) ? null : (int?)nonQueryReturnParm.Value; 

       Console.WriteLine("Entities returned: {0}", entityResults.Count()); 
       Console.WriteLine("Scalar result: {0}", scalarResult); 
       Console.WriteLine("Non-query results: {0}/{1}", nonQueryResult, nqrpValue); 
      } 
      finally 
      { 
       db.Database.Connection.Close(); 
      } 
     } 

     Console.ReadLine(); 
    } 

    private static DbCommand GetCmd(DbContext context, int value) 
    { 
     var cmd = context.Database.Connection.CreateCommand(); 

     var inParm = cmd.CreateParameter(); 
     inParm.ParameterName = "@mode"; 
     inParm.Value = value; 

     var outParm = cmd.CreateParameter(); 
     outParm.ParameterName = "@RETURN_VALUE"; 
     outParm.Direction = ParameterDirection.ReturnValue; 

     cmd.CommandText = "dbo.FuzzyResultSet"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddRange(new []{ inParm, outParm }); 

     return cmd; 
    } 
} 
相關問題