2014-03-07 3 views
1

탐색 속성을 저장하지 않고 엔티티를 저장하는 우아한 방법이 있습니까?탐색 속성을 저장하지 않고 EF 엔티티 저장

웹 페이지에서 웹 API 서비스로 엔티티 그래프를 보냅니다. 클라이언트는 탐색 속성에 액세스 할 수 없으므로 해당 속성이없는 데이터를 다시 서버로 보냅니다. 엔티티를 State.Modified으로 표시하면 EF는 관계를 저장하려고 시도합니다.

나는 워크 플로우를 다음 시도거야,하지만 매우 그것을 좋아하지 않아 :

  1. 로드 원래의 엔티티를 데이터베이스
  2. 에서에 수정에서 모든 비 탐색 속성을 복사하는 일반적인 방법을 만들기 (내가 외국 키도 매핑이 있기 때문에) Id로 끝나는 이름을 가진 원래의 실체
  3. 속성은 복사되지 않습니다
  4. 저장 그러한 주체

매우 우아하지 않습니다. 어떻게 할 건데?

+0

AutoMapper와 같은 매핑 라이브러리는 어떤 공통 속성 만 매핑합니까? 일반 규칙을 만들 수도 있습니다 ("Id로 끝나는 속성을 사용하지 마십시오"). –

+0

이것이 현재의 아이디어입니다. 제가 묻기를 시도한 것은, EF에게 그들을 저장하지 말라고 지시하는 방법이 있는가, 그렇지 않으면 EF가 이것을 처리하게하는 것입니다. 그렇지 않다면 당신은 저에게 답을 주셨습니다. 다른 아이디어가 있는지보기 위해 조금 더 기다릴 것입니다. –

답변

0

매우 우아하지 않습니다. 어떻게 할 건데?

나는 것 하지 쓰기 뭔가 그 자동적으로 가장의 경우 작품. 나는 을 자동화하고을 자동으로 싫어한다.

그래서 내가 수동으로 일을하게 될 겁니다 :

public User UpdateUser(User updatedUser) 
{ 
    // Gets the original entity 
    var dbUser = this.context.Users.SingleOrDefault(z => z.Id == updatedUser.Id); 
    if (dbUser == null) 
    { 
     // Exception here 
    } 

    // Manually update ONLY properties that can be updated through UpdateUser 
    dbUser.Name = updatedUser.Name; 
    dbUser.FirstName = updatedUser.FirstName; 
    ... 

    // Saves the context 
    this.context.SaveChanges(); 

    // Returns updated entity 
    return dbUser; 
} 

훨씬 더 안전한 이 서비스 또는 속성 이름에 따라 규칙을 호출 레이어에 의존하지 않는 속성을 할 수 있도록하기 위해 업데이트 여부.

예를 들어 위의 경우 ChangePassword 서비스가있는 경우 User.PasswordHash 속성을 업데이트하지 않으려한다고 가정 할 수 있습니다.

+0

오토 데스크에 어떤 마법도 보이지 않습니다. 쓸 수있을 때 20 줄의 코드를 작성하는 것을 좋아하지 않습니다. 그러나 그것은 또 다른 관점입니다.) –

+0

@ RaphaëlAlthaus 네, 마법은 없지만, 특히 특정 매핑 규칙을 추가 할 때 내부적으로 수행되는 작업에 대해 너무 많은 추상화가 있습니다. 다른 문제는 실수를하는 것이 정말 쉽다는 것입니다. 'User' 엔티티에'UserCreationDate'라는 새로운 속성을 추가한다고 상상해보십시오. 정말로'UpdateUser' 서비스에서 업데이트하고 싶지는 않습니다. 당신이 그에게 다르게 지시하지 않으면 자동 대문자 때문에 그럴 것입니다. 나는 뭔가 새로운 _ 코드를 추가하는 대신에 뭔가 새로운 _ 코드를 추가하는 것을 선호합니다. – ken2k

+0

나는 원칙적으로 Ken에 동의하지만 리드 엔지니어에게는 한 번 책임이 있다고 생각하며 책임을 다른 사람들에게 줄 것입니다.나는 한계를 벗어난 속성이나 관련 엔티티에 누군가가 값을 주입하도록해서는 안되기 때문에 현재 내가 한 것에 대해 어떻게 생각하는지 궁금합니다. 주어진 엔터티에 변경 사항을 적용하고 제공된 유형 ('T1','T2',.)과 일치하는 탐색 속성을 탐색하는 서명 된'void ApplyDbGraphChanges (엔터티) ..). 물론 덜 일반적인 매개 변수를 사용하는 비 제너릭 메서드와 메서드도 있습니다. –

관련 문제