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 Hoffmann : 안타깝게도 기본 키가 없습니다. – 14578446

답변

1

Session 테이블에 기본 키가없는 경우이 키는 DefiningQuery으로 매핑되어 읽기 전용입니다. 이러한 작업을 정의하는 저장 프로 시저를 만들고 모델에 매핑하지 않는 한 DefinedQuery에 매핑 된 레코드를 삭제하거나 삽입하거나 업데이트 할 수 없습니다.

그 후에도 충분하지 않아도됩니다. 엔티티는 해당 키로 삭제됩니다. 엔티티 모델에서 키를 정의 할 수 있지만 키는 레코드를 고유하게 식별해야합니다. 기본적으로 EF는 nullable이 아닌 모든 이진 열을 키로 사용합니다. 이 열 세트가 레코드를 고유하게 식별하지 못하면 Session 엔티티를 사용할 때 더 많은 문제가 있습니다 (예를 들어 삭제 작업은 둘 이상의 레코드를 삭제하고 SaveChanges은 실패합니다).이 경우 유일한 옵션은 그 표를 ​​키로 사용하십시오. PK를 테이블에 추가하면 이러한 모든 문제가 해결됩니다.

+0

테이블에 여러 개의 coulumn이 있는데, PK에 적합하고 디자이너의 엔터티 키로 표시되어 있습니다. User_id 해당 열 중 하나입니다 있지만 레코드 delte 수 없습니다 및 m 위의 예외를받습니다. – 14578446

1

메시지는 문제가 무엇인지 알려주고 있습니다. 나는 정교하게 노력할 것이다.

기본적으로 Entity Framework는 개체를 가져 오는 쿼리를 생성합니다. "Session"개체에 대한 EntityContainer에는 명시 적 쿼리가 있습니다. 즉, EntityFramework에 세션을 가져 오기 위해 특정 필기 SQL (또는 저장된 proc)을 사용하라는 메시지가 표시됩니다.

해당 동작을 재정의 할 때 세션을 삭제하는 방법을 알려주는 쿼리도 제공해야합니다. Here is the documentation에서 Entity Framework 컨테이너에 삭제 기능을 추가하는 방법에 대해 설명합니다.