2013-04-26 65 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);