如何避免更新现有存储过程的EntityModel.Context?

时间:2017-02-02 07:55:27

标签: c# winforms entity-framework stored-procedures

我正在开发一个Windows应用程序。我有一个模型类型的实体模型从数据库生成。我首先导入了一些存储过程,对于一个SP,我已经更改了将数据类型从bool替换为int的上下文。现在,当我尝试更新模型(添加SP)时,已更改的SP的上下文恢复为其默认类型,即bool导致错误(函数具有无效参数)。

这是模型的Context.cs。这里当我将类型从bool更改为int时,应用程序工作正常,但是当我更新模型时,类型又回到bool及其抛出错误。怎么避免这个?

public virtual ObjectResult<Web_get_obj_details_Result> Web_get_obj_details(Nullable<byte> hcode, Nullable<byte> vcode, Nullable<byte> yearcode, Nullable<short> tranno)
        {
            var hcodeParameter = hcode.HasValue ?
                new ObjectParameter("hcode", hcode) :
                new ObjectParameter("hcode", typeof(byte));

            var vcodeParameter = vcode.HasValue ?
                new ObjectParameter("vcode", vcode) :
                new ObjectParameter("vcode", typeof(byte));

            var yearcodeParameter = yearcode.HasValue ?
                new ObjectParameter("yearcode", yearcode) :
                new ObjectParameter("yearcode", typeof(byte));

            var trannoParameter = tranno.HasValue ?
                new ObjectParameter("tranno", tranno) :
                new ObjectParameter("tranno", typeof(short));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Web_get_obj_details_Result>("Web_get_obj_details", hcodeParameter, vcodeParameter, yearcodeParameter, trannoParameter);
        }

我如何访问SP:

IList<Web_get_obj_details_Result> ObjWeb_get_obj_details_Result = EntityObj.Web_get_obj_details(HobliCode, VillageCode, YearCode,TranNo).ToList<Web_get_obj_details_Result>();

此处HobliCode,VillageCode,YearCode,TranNo的类型为int。

仅供参考:这是我的SP

ALTER PROCEDURE  [dbo].[Web_get_obj_details]
@hcode as tinyint , @vcode as tinyint , @yearcode as tinyint , @tranno as smallint
as
declare @dcode as integer , @tcode as integer 
begin tran
    select @dcode = dist_code , @tcode  = taluk_code from mst_config 
    select convert(varchar(10),notice_sdate,103) as notice_sdate ,convert(varchar(10),obj_date,103) as obj_date,objector_name,obj_details from tr_objection
    where dist_code= @dcode and taluk_code = @tcode and  hobli_code = @hcode  and village_code = @vcode and tran_no =@tranno and year_code=@yearcode 
commit tran

每次更新模型时,我都不想更改该SP的上下文。任何解决方案为什么模型将类型取为bool,即使类型是int?

1 个答案:

答案 0 :(得分:1)

您的存储过程使用tinyintsmallint作为参数类型。 EF在您的存储过程的访问器方法中反映了这一点,并生成包含在{{1}中的相应类型byteshort(又名ByteInt16)的方法}。

EF数据库中的黄金法则首先是:不要修改生成的代码。它将在下次更新时被覆盖。

您有两种方法可以解决您的问题:

  1. 更改存储过程以使用Nullable<T>类型作为参数,并从数据库更新模型。访问方法将使用int(又名int)然后。
  2. 在上下文的自定义扩展中创建一个包装器方法。您可以将自动生成的方法设为私有(通过设计器 - 记住永远不要修改自动生成的代码)以防止直接访问。
  3. 这看起来像这样:

    Int32