2013-02-08 3 views
0

초기 작성 후 개발자가 수동으로 또는 프로그래밍 방식으로 코드의 기본 키를 업데이트하지 못하게하는 검사를 구현하는 데 문제가 있습니다.Entity Framework OnChanging 기본 키 보호

partial class User 
{ 
    public User() 
    { 
     this.UserId = sGuid.NewSGuid(sGuidType.SequentialAtEnd); 
    } 

    partial void OnUserIdChanging(Guid value) 
    { 
     //throw if its an edit... 
     throw new DbEntityValidationException("Cannot mutate primary key"); 
    } 

} 

개체를 편집/업데이트 할 때 제대로 작동하지만 사실 처음에는 새 개체를 만들지 않습니다. 이 시점에서 새로운 엔티티 또는 기존 엔티티가 있는지 확인할 수있는 방법이 있습니까? 사전에

감사합니다, 피트

UPDATE :

내가 게시 한 후 일반적인 난 항상 답을 찾을 -_-! 당신의 답변을 주셔서 감사합니다, 나는 올바른 대안으로 올바른 대답으로 당신의 하나를 표시합니다. 이 속성 그리드 EF 디자이너, 디자이너 단지 속성을 선택하고 설정 적절한 액세스 한정자를 사용하는 경우

public class MyEntity 
{ 
    public int Id { get; private set; } 
} 

:

if (this.EntityState != System.Data.EntityState.Detached) 
{ 
    throw new DbEntityValidationException("Cannot mutate primary key"); 
} 
+0

글쎄, 당신은 키가있는 데이터베이스를 쿼리 할 수 ​​있습니다. 만약 수정이 있었다면, 그렇지 않으면, 새로운 객체가 ... 아니면 내가 뭔가 잘못되었습니다. –

+0

UserId setter를 비공개로 만듭니 까? –

+0

나는 이것을 (개인적으로 설정하는 것) 생각한다. 그러나 그것을 업데이트 할 수있는 클래스 메소드를 생성하는 것을 막을 수는 없습니다. 그러나 나는 그들이 수표를 모두 제거하는 것을 막을 수는 없을 것이라고 생각합니다. onChanging 이벤트에서 방금 새 값을 가져오고 수동으로 설정하면 잘못된 레코드 등이 충돌 할 수 있습니다. 자동으로 코드 생성을 사용했기 때문에 비공개로 설정하지 않으려는 이유는 모델을 업데이트 할 때마다 파괴됩니다. < –

답변

1

이 문제는 일반적으로 기본 키 세터 private 또는 protected함으로써 해결된다 - 코드 생성기가 나머지 작업을 수행합니다.

+0

안녕하세요, 위의 내 의견을 참조하십시오. 클래스 내부 메서드를 업데이트하고 바보 같은 짓을하는 사람을 제거하기 위해 onChanging 이벤트를 원했던 것 같습니다. 그러나 둥근 방법이 없다면 나는 선택의 여지가 없다고 생각한다. ( –

+0

@PeterLea 개발자가 뭔가 잘못하고 있다고 경고하는 것에 더 집중해야한다. (내부 메서드를 수정해야한다는 사실이 isn 인 경우 아무 것도 없다). 어리 석음을 없애려는 노력보다. 나는 너를 약속한다, 후자는 불가능한 일이다.) – Dan

관련 문제