3

私は例外を受け取っています:

DefiningQuery があり、現在の操作をサポートする要素が要素に存在しないため、EntitySet 'Session' を更新できません。

データベース テーブルから行を削除しようとしたとき。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();
  }
}
4

2 に答える 2

1

メッセージは、問題が何であるかを示していますが、あまりよくありません。詳しく説明してみます。

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

その動作をオーバーライドするときは、セッションを削除する方法を指示するクエリも提供する必要があります。このような削除機能を Entity Framework Container に追加する方法に関するドキュメントを次に示します。

于 2012-01-17T21:12:02.010 に答える
1

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

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

于 2012-01-18T11:24:13.923 に答える