2011-11-11 3 views
0

First Name, LastName 및 DOB 속성뿐만 아니라 Id 속성 (기본 키)을 가진 Person과 같은 간단한 클래스가 제공됩니다.먼저 EF 코드로 논리적 중복을 방지 할 수 있습니까?

작성 작업을 호출 할 때 전달중인 모델이 FirstName, LastName 및 DOB 속성이 이미 존재하는 레코드와 일치하는지 확인하기 위해 유효성 검사를 수행하려고합니다. 이 경우에는 앱에 들어오는 모델에 아직 모델이 없기 때문에 Id 속성을 제외하고 싶습니다. 잘못된 값을 생성합니다.

현재 난 그냥 ...과 같이 확실하게 작동하지만 우아하지, 음, 전적으로

if (!context.People.Any(x => x.FirstName == model.FirstName && x.LastName == 
model.LastName && x.DOB == model.DOB)) 

을 모든 확장 방법을 사용하고 있습니다.

분명히 더 좋은 방법이 있습니까?

+0

DB에 고유 한 제약 조건이있는 항목을 피하고 코드에서 적절한 오류 처리를 피할 수 있습니다. 값이 유지되기 전에 중복을 검사하고 싶다면,'Any()'는 완전히 우아하지는 않지만 완벽하다고 생각합니다. –

+0

가능한 복제본 [Entity Framework에 개체가 있는지 확인하는 가장 좋은 방법은?] (http://stackoverflow.com/questions/1802286/best-way-to-check-if-object-exists-inentent-framework) –

+0

이것은 중복이 아니므로 참조한 질문에 대한 대답은 내가 명시 적으로 피하고자한다고 말한 것입니다. – keithwarren7

답변

0

컨트롤러에서 모든 통화를 직접 보지 않거나 전혀 통화를 좋아하지 않는 문제가 있습니까?

전자의 경우 유효성 검사 프레임 워크를 사용하여 컨트롤러에서 세부 정보를 숨 깁니다. 후자의 경우 데이터베이스의 저장 프로 시저/함수를 생성하여 대신 호출 할 수 있습니다.

나는이 코드가 좋지 않다고 생각하지 않습니다. 나는 그것이 검증 일 필요가 있다고 생각합니다. FluentValidation은 꽤 좋지만 DataAnnotations도 잘 작동합니다.

+0

실제 문제는 Any에 대한 호출이 각각의 경우 비 핵심 속성을 쓰는 것에 달려 있다고 생각합니다. 엔티티가 필요합니다. 지금 당장 모델을 받아들이고 키가 아닌 속성의 값과 일치하는 확장 메서드를 작성할 것이라고 생각합니다. 결론적으로, 나는 '어떻게하면 이보다 더 게으른가요?'라는 질문을 할 수있었습니다. – keithwarren7

+0

확장 메소드를 작성하는 것이 귀하의 질문에 대한 답변이었습니다. 그것은 최상의 솔루션 인 것 같습니다. 어떻게 더 게으른 수 있습니까? 그렇게 물어보고 다른 사람이 당신을 위해 그것을 쓰는 지 알아 보자.) – Sorax

+1

@ keithwarren7 - 확장 방법이 정적이기 때문에 확장 방법은 좋지 않을 것이다. 프로그램의 수명 동안 열린 연결을 유지하기 때문에 확장 메서드에서 데이터베이스를 쿼리하지 않으려합니다. –

1

고유성이 비즈니스 요구 사항이라면 고유 한 제약 조건으로 데이터베이스에서이를 처리해야합니다. 그런 다음 검사 할 필요가 없습니다. 데이터베이스가 예외를 throw하고 위반 된 경우 알려줍니다. 예외를 처리하고 사용자에게 이미 시스템에 있음을 알립니다.

+0

나는이 접근법에 동의하지 않는다. 유효성 검사기를 사용하는 것이 더 좋습니다. 유효성 검사 이외에 고유 한 제한 조건을 가질 수 있지만 이런 예외가 발생할 것으로 예상해서는 안됩니다. 그래도 내 의견. – Dismissile

+0

나도 동의하지 않는다. 그것은 매우 휘발성 인 해결책이다. 예외를 통한 애플리케이션의 제어 흐름은 나쁜 코드의 속성 목록에서 실제로 높다. – keithwarren7

+0

@ keithwarren7 - 이것은 제어 흐름이 아닙니다. 레코드를 업데이트하거나 레코드를 삽입하기로 결정할 때 예외를 사용하지 않습니다. 그건 나쁠거야.사용자가 중복 레코드를 삽입하는 경우입니다. 유일한 다른 선택은 데이터베이스를 먼저 쿼리하는 것이지만, 그렇게하고 싶지 않다고 말한 것입니다. –

관련 문제