2011-08-10 9 views
2

Entity Framework 4.1およびMySql Connector/Net 6.4.3の標準関数に問題があります。 Microsoftのカノニカル関数は、LINQによって生成されたSQLからすべてのデータベースプロバイダによってローカルSQLダイアレクトに変換され、解釈されます。 http://msdn.microsoft.com/en-us/library/bb738626.aspxしかし、ここに記載されているCurrentUtcDateTime()のコードは、これは、エラーがoutputedされるCurrentUtcDateTimeが存在しません - Entity FrameworkおよびMySql

SELECT`Project1`.`PollID`, `Project1`.`LanguageID`, `Project1`.`Name`, 
`Project1`.`Published`, `Project1`.`ShowOnHomePage`, `Project1`.`DisplayOrder`, 
`Project1`.`SystemKeyword`, `Project1`.`StartDate`, `Project1`.`EndDate` 
FROM (SELECT`Extent1`.`PollID`, `Extent1`.`LanguageID`, `Extent1`.`Name`, 
`Extent1`.`SystemKeyword`, `Extent1`.`Published`, `Extent1`.`ShowOnHomePage`, 
`Extent1`.`DisplayOrder`, `Extent1`.`StartDate`, `Extent1`.`EndDate` 
FROM `Nop_Poll` AS `Extent1` WHERE ((((`Extent1`.`Published` = 1) AND 
((`Extent1`.`StartDate` IS NULL) OR (`Extent1`.`StartDate` <= (CurrentUtcDateTime())))) 
AND ((`Extent1`.`EndDate` IS NULL) OR (`Extent1`.`EndDate` >= (CurrentUtcDateTime())))) 
AND (`Extent1`.`ShowOnHomePage` = 1)) AND (`Extent1`.`LanguageID` = @p__linq__0)) 
AS `Project1` ORDER BY `Project1`.`DisplayOrder` ASC LIMIT 2147483647 

public List<Poll> GetPolls(int languageId, int pollCount, bool loadShownOnHomePageOnly) 
    { 
     bool showHidden = NopContext.Current.IsAdmin; 


     var query = (IQueryable<Poll>)_context.Polls; 
     if (!showHidden) 
     { 
      query = query.Where(p => p.Published); 
      query = query.Where(p => !p.StartDate.HasValue || p.StartDate <= DateTime.UtcNow); 
      query = query.Where(p => !p.EndDate.HasValue || p.EndDate >= DateTime.UtcNow); 
     } 
     if (loadShownOnHomePageOnly) 
     { 
      query = query.Where(p => p.ShowOnHomePage); 
     } 
     if (languageId > 0) 
     { 
      query = query.Where(p => p.LanguageId == languageId); 
     } 

     query = query.OrderBy(p => p.DisplayOrder); 
     if (pollCount > 0) 
     { 
      query = query.Take(pollCount); 
     } 

     var polls = query.ToList(); 

     return polls; 
    } 

query.ToList()は以下のSQLを生成する:ここ

http://msdn.microsoft.com/en-us/library/bb738563.aspxは攻撃SQLを生成する(NopCommerceから)LINQクエリです。

*FUNCTION myDatabase.CurrentUtcDateTime does not exist 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: MySql.Data.MySqlClient.MySqlException: FUNCTION myDatabase.CurrentUtcDateTime does not exist* 

私に何かが不足していますか?ご意見をお聞かせください。ありがとう。 UTC_TIMESTAMP()

答えて

-1

使用すると、私はこれと同じ問題が発生し、それを理解しようとしてほぼ二日間を失いました。 MySqlのEntityFrameworkマッピングのバグであるようです。

解決策は、スコープ付きラムダの外にDateTime.UtcNowの計算を移動し、実際の値を差し込みます。

var utcNow = DateTime.UtcNow; 
query = query.Where(p => p.Published); 
query = query.Where(p => !p.StartDate.HasValue || p.StartDate <= utcNow); 
query = query.Where(p => !p.EndDate.HasValue || p.EndDate >= utcNow); 
+1

返信いただきありがとうございます。 SQLはEFによって自動的に生成されるので、関数を変更することはできません。またはこれを行うためのスイッチがあります(これは私の最初のEFプロジェクトなので、まだ学習しています)。 – user888112

8

+2

私は自分の答えにそんなに素早く遭遇したことは幸運であると考えます。このバグはまだ4年後に修正されていないというのは残念です。 – Kazu

+0

これもちょうどうまくいった。ばかげたバグレポートを聞いている人はいません。エンティティデザイナの "IsPrimaryKey"エラーにこれを追加してください。まだまだ間に合います。 –

0

ボヘミアンの提案に基づいて、私はこの問題を「バイパス」機能で解決しました。

CREATE FUNCTION `your_schema`.`CurrentUtcDateTime`() 
RETURNS TIMESTAMP DETERMINISTIC 
RETURN UTC_TIMESTAMP(); 
+1

私はこれが複製に安全だとは思わない。私は2つのデータベースを持っていて、この機能を1つで実行すると、後で別のデータベースに複製され、別の結果が生成されます。私はここでは「決定的」を使うべきではないと思います。 –

関連する問題