2013-04-26 119 views
2

尝试转换为EF 5,但遇到CreateQuery问题。任何帮助将非常感激。先谢谢你。使用实体框架的CreateQuery 5

这是代码:

using System; 
using System.ServiceModel; 
using System.Data.Objects; 
namespace TestingOneServiceRole 
{ 
    public class Service1 : IService1 
{ 
public void AddUser(string fullName, string userName, string password) 
    { 
     using (var context = new MyEntities()) 
     { 
      context.AddToUser(new User() 
      { 
       UserName = userName, 
       Password = password, 
       FullName = fullName, 
      }); 
      context.SaveChanges(); 
     } 
    } 
    public string UserLoginNow(string username, string password) 
    { 
     string query = @"SELECT value blah.FullName FROM MyEntities.blah AS User WHERE blah.UserName = @username AND blah.Password = @password"; 
     ObjectParameter[] parameters = new ObjectParameter[2]; 
     parameters[0] = new ObjectParameter("username", username); 
     parameters[1] = new ObjectParameter("password", password); 
     using (var context = MyEntities()) 
     { 
      ObjectQuery<string> results = context.CreateQuery<string>(query, parameters); 
      foreach (string result in results) 
      { 
etc....... 
+0

? – GrandMasterFlush 2013-04-26 15:56:50

+0

我收到“TestingOneServiceRole.MyEntities”不包含“CreateQuery”的定义并且没有扩展方法的错误... – Robin 2013-04-26 16:05:05

回答

2

我在此响应你的MyEntities从继承的DbContext在EF5承担。

使用SqlQuery类(T)的在DbContext.Database属性的方法来完成同样的事情:

public string UserLoginNow(string username, string password) 
{ 
    string query = @"SELECT value blah.FullName FROM MyEntities.blah AS User WHERE blah.UserName = @username AND blah.Password = @password"; 
    object[] parameters = new object[2]; 
    parameters[0] = username; 
    parameters[1] = password; 
    using (var context = MyEntities()) 
    { 
     IEnumerable<string> results = context.Database.SqlQuery<string>(query, parameters); 
     foreach (string result in results) 
     { 
     } 
    } 
} 

如果从您的ObjectContext的实体框架模型dervies(相对的DbContext),然后看到这个link provided by @MarkSowul上如何获得访问的createQuery方法EF 5

+0

这不是可组合的。在论坛中提到的一种解决方法是投射到IObjectContextAdapter(http://social.msdn.microsoft.com/Forums/zh-CN/a0738f30-993f-4c53-9f4e-06c5e9dbd7ae/why-is-createquery-no-longer-可用命名空间移动) – 2013-06-28 14:13:12

+0

@MarkSowul“composable”是什么意思?另外,在我的回答中,我做了假设,因为没有提供支持变量上下文的类的原始代码,OP从DbContext派生。如果OP使用DbContext,那么我的答案正常工作(请参阅http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext.database%28v=vs.103%29.aspx和http ://msdn.microsoft.com/en-us/library/system.data.entity.database%28v=vs.103%29.aspx)。如果它们是从ObjectContext派生的,那么你的解决方法是有效的,我会将它添加到我的答案中。 – 2013-06-28 18:14:02

+0

By Composable我的意思是你可以,例如,添加一个where子句,它将在数据库中被过滤,而不是在内存中。 对不起,实体框架有时真的让我疯了,我对此感到胡思乱想。我当时正在做一个傻瓜式的差事,试图让表值函数工作,并且遇到了人们为EF4提出的CreateQuery的死胡同。 – 2013-06-28 19:13:38

1

有两个步骤:

一,引用添加到类:

using System.Data.Entity.Infrastructure; 

二,什么问题你有重写代码为

var result= ((IObjectContextAdapter)context).ObjectContext.CreateQuery<blah_name>(query);