3

を削除します。は、私は例外を受け付けておりますレコードエンティティフレームワーク

それはDefiningQueryを持っているためのEntitySet「セッション」を更新できませんし、無 要素が サポート現在の操作に要素内に存在しています。

データベーステーブルから行を削除しようとしています。存在する行に対してSaveChanges()を呼び出すと、例外が表示されます。以下は私のコードです:

public static Func<DC21GPDEntities, string, IQueryable<Session>> compiledDeleteQuery = 
    CompiledQuery.Compile((DC21GPDEntities ctx, string userId) => 
     (from rows in ctx.Sessions 
     where rows.User_ID == userId 
     select rows)); 

[HttpPost] 
public ActionResult Index(string searchItem) 
{ 
    try 
    { 
     string userId =searchItem.Trim(); 
     string successMessage 
       = "The session for User ID: " + userId + " has been cleared in Fascor."; 

     dc21gpdContext.CommandTimeout = 180; 

     Models.Session session = Queries.compiledDeleteQuery(dc21gpdContext, userId).FirstOrDefault(); 

     if (session == null) 
      successMessage = "Session for User ID: " + userId + " does noe exist"; 
     else 
     { 
      dc21gpdContext.DeleteObject(session); 
      dc21gpdContext.SaveChanges(); 
     } 

     ViewData["SuccessMessage"] = successMessage; 
     return View(); 
    } 
    catch (Exception ex) 
    { 
    ViewData["SuccessMessage"] = "Failed to clear session"; 
    return View(); 
    } 
} 
+2

セッションテーブルにプライマリキーがありますか? –

+0

@Klaus Byskovホフマンは:残念ながら、それは私がPKの予選、私のテーブルに複数のcoulumnsを持っていると私はそれらがデザイナーでエンティティのキ​​ーとしてマークされて見ることができ、主キー – 14578446

答えて

1

Sessionテーブルにプライマリキーがない場合は、DefiningQueryとしてマップされ、読み取り専用になります。 DefinedQueryにマップされているレコードを削除、挿入、または更新することはできません。これらの操作を定義しているストアドプロシージャを作成してモデルにマップする必要があります。

その後もそれは十分である必要はありません。エンティティはキーによって削除されます。エンティティモデルでキーを定義できますが、キーはレコードを一意に識別する必要があります。デフォルトでは、EFはnullではないすべての非バイナリ列をキーとして使用します。列のこのセットは、レコードを識別していない場合は一意に、あなたは(失敗する複数のレコードとSaveChangesを削除します削除操作など)Sessionエンティティを使用してより多くの問題を持っています - このような場合にのみオプションがに一意の列を追加していますテーブルを作成し、キーとして使用します。 PKをテーブルに追加すると、これらの問題はすべて解決されます。

+0

を持っていません。 User_idはそれらの列の1つですが、私はレコードをdelteできず、上記の例外を受け取っています。 – 14578446

1

メッセージは問題が何かを伝えています。私は精緻化しようとします。デフォルトで

Entity Frameworkのオブジェクトを取得するためのクエリを生成します。 SessionオブジェクトのEntityContainerには明示的なクエリがあります。つまり、EntityFrameworkは、セッションをフェッチするために手書きSQL(またはストアドプロシージャ)の特定の部分を使用するように指示されています。あなたがその動作をオーバーライドする場合

、あなたはまた、セッションを削除するには、どのようにそれを伝えるクエリを提供する必要があります。そのような削除機能をEntity Framework Containerに追加する方法については、Here is the documentationを参照してください。

関連する問題