Code First调用存储过程传入​​3个参数验证错误

时间:2017-03-29 05:43:56

标签: c# sql-server entity-framework linq ef-code-first

我在传入一个参数时成功调用存储过程,但现在我的代码第一个dbcontext,我想保持简单,但我根据我看到的一些答案改变了代码:/ not working

好的,首先,这里的代码可以正常工作:

#include <stdio.h>

int main()
{
    char name[100],stdid[100],adv[100],subject[6][100],code[6][30];
    int sem,in,total,a;
    int credit[6];

    printf ("SUBJECT REGISTRATION FORM \n \n");

    printf ("1) STUDENT NAME: ");
    fflush (stdin);
    gets (name);

    printf ("2) STUDENT ID: ");
    scanf ("%s",&stdid);

    printf ("3) SEMESTER: ");
    scanf ("%d",&sem);

    printf ("4) ACADEMIC ADVISOR: ");
    fflush (stdin);
    gets (adv);


    for (in=0; in<6 ;in++)
    {
        printf ("SUBJECT CODE %d: ",in + 1);
        fflush (stdin);
        gets (code[in]);

        printf ("SUBJECT NAME %d: ",in + 1);
        fflush (stdin);
        gets (subject[in]);

        printf ("SUBJECT CREDIT %d: ",in + 1);
        fflush (stdin);
        scanf ("%d",&credit[in]);

        total=total+credit[in];
    }

    printf ("                       Universiti of Gambang \n");
    printf ("                     Subjects Registration Form \n");
    printf     ("======================================================================= \n");

    printf ("Name: %s \n",name);
    printf ("Student ID: %s \n",stdid);
    printf ("Total Subjects: %d \n",in);

    printf ("---------------------------------------------------------------    --------- \n");

    printf ("Subject Name                Subject code                              Credit \n");

    for (a=0;a<in;a++);

    {
        printf (" %d %s                           %s                                     %d        \n",a ,subject[a] ,code[a] ,credit[a]);
    }

    printf ("Total Credit:                                                              %d        \n",total);

    printf ("Academic Advisor: %s \n",adv);

    return 0;
}

上面的代码工作正常,但这里的代码不起作用(我传递了3个参数)

var param = new SqlParameter("@dt", myTime);
var result = _db.Database.SqlQuery<QAList>("dbo.GetDateTime @datetime", param).ToList(); 

现在我知道我没有使用相同类型的语法var paramPhone = validRequest.Phone; var paramAccount = validRequest.AccountNumber; var paramLead = validRequest.LeadId; var result = _db.ValidRequests.SqlQuery( "dbo.CheckForValidRequest @Phone, @AccountNumber, @LeadId", paramPhone, paramAccount, paramLead); ,但这是基于我在别处读到的内容。

我确实设置了dbcontext.Database,所以看起来像这样

DbSet

但是,我没有像使用linq到SQL查询那样使用modelBuilder在 public DbSet<ValidRequest> ValidRequests { get; set; } 中做任何事情。

我的错误讯息:

  

在模型生成期间检测到一个或多个验证错误:

     

MyProject.ValidRequest:EntityType'ActiveRequest'没有定义键。定义此EntityType的键   ValidRequests:EntityType:EntitySet'ValidRequests'基于没有定义键的'ValidRequest'类型

通常我会定义一个键,但这是我正在调用的存储过程...

更新:尝试不同的方式,但是......它正在进入onModelCreating

我正在尝试这种方法

OnModelCreating

当我根据传入的数据得到0时返回-1:/

更新2 - 我添加了一个OUPUT参数并且花了太多时间,我真的想弄清楚如何解决这个问题,但是现在我很遗憾地走向老学校:(

 using(var _db = new ClearviewContext())
   {
      var p = new SqlParameter("@Phone", paramPhone);
      var a = new SqlParameter("@AccountNumber", paramAccount);
      var l = new SqlParameter("@LeadId", paramLead);
      var r = _db.Database.ExecuteSqlCommand("exec CheckForValidRequest @Phone, @AccountNumber, @LeadId", p, a, l); 
   }

1 个答案:

答案 0 :(得分:0)

在EF的早期版本中,Entity模型类派生自Objectcontext      但现在它派生自DbContext类,它是ObjectContext类的包装类。

要调用存储过程,我们需要ObjectContext的实体实例

 var context = (_entity as IobjectContextAdapter).ObjectContext;//ObjectContext have ExecuteStoreQuery<T> as overloaded method and T denote the return type

1。 不带参数的存储过程:
  一个。 GetStatus - 存储过程的名称   湾空对象集合作为参数。

var lst = context.ExecuteStoreQuery<tblStatu>("GetStatus", new string[] { });

2。 带参数的存储过程
一个。 GetMyName - 存储过程的名称 湾@FirstName,@ LastName =参数。
C。参数 - 将对象集合为参数。

var parameter = new object[] {
                 new SqlParameter("@FirstName", "Vikas"),
                 new SqlParameter("@LastName", "Mahajan")
                };
Int32 recordID = context.ExecuteStoreQuery<Int32>("GetMyName", @FirstName,@LastName, parameter).FirstOrDefault();

3。 具有复杂返回类型的存储过程: 对于复杂返回类型,我们需要使用存储过程的返回数据集中的属性声明一个自定义类 一个。 SvcRequestStatus(T) - 自定义类
湾GetStatusDynamixQuery - 存储过程的名称。
C。作为参数的对象的空集合。

IEnumerable<SvcRequestStatus> lst1 = context.ExecuteStoreQuery<SvcRequestStatus>("GetStatusDynamixQuery", new string[] { });

希望这会有所帮助!!