2010-11-22 3 views
0

데이터 주석을 사용하여 부분 클래스를 사용하여 Entity Framework 모델의 유효성을 검사하려고합니다.MetadataType, Annotations 및 EF에 몇 가지 문제가 있음

article (MSDN)에 부분 클래스가 데이터 모델과 동일한 네임 스페이스에 있어야한다고 들었습니다. MyApp.Backend.Models에 위치한 내 일부 클래스는 다음과 같습니다 그래서 내 데이터 모델은 EntityFrameworkDataProvider에 있습니다

[HttpPost] 
public ViewResult Edit(Item item) 
{ 
    if (!TryUpdateModel(item)) 
    { 
     return View(item); 
    } 

    return View("Details", item); 
} 

:

using System.ComponentModel.DataAnnotations; 

namespace EntityFrameworkDataProvider 
{ 
    [MetadataType(typeof(ItemMetaData))] 
    public partial class Item { } 

    public class ItemMetaData 
    { 
     [ScaffoldColumn(false)] 
     public object CreateDate { get; set; } 

     [Required] 
     public string DisplayName { get; set; } 

     [Required] 
     public string Description { get; set; } 
    } 
} 

이 같은 내 컨트롤러 클래스에서 모델을 검증 오류없이 컴파일됩니다. 그러나 항목을 편집 할 때이 오류는 내가 얻은 것입니다.

컴파일러 오류 메시지 : CS0433 : 'long-path.DLL'및 'long-path.DLL'형식에 'EntityFrameworkDataProvider.Item'형식이 있습니다. '

나는 Item 클래스가 두 번 또는 뭔가 컴파일되고 있다고 생각한다. 이 오류는 어떻게 방지해야합니까?

답변

2

컨트롤러 동작이 잘못되었습니다. 동일한 유형에 조치 매개 변수와 TryUpdateModel을 사용해서는 안됩니다. 이는 모델 상태에 오류 메시지를 두 번 삽입하기 때.입니다. 당신의 행동은 다음과 같이 보일 것입니다 :

[HttpPost] 
public ViewResult Edit(Item item) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(item); 
    } 
    return View("Details", item); 
} 

컴파일러 오류 메시지까지 당신은 내가 당신을 도울 수 있도록 충분한 정보를 제공하지 못하고 있습니다. 이 Item 클래스가 다른 위치에 정의되어 있지 않고 실제로 발생하는 모든 .cs 파일에 partial이라는 사실을 확인하십시오. 나는 어딘가에 부분적이 아닌 Item 클래스를 정의했다고 생각합니다. 주의해야 할 점은이 Item 클래스가 별도의 어셈블리에 정의되어있는 경우 부분 클래스로 표시되어 컴파일 된 후에도 partial이라는 개념이 더 이상 존재하지 않는다는 것입니다. 부분 클래스는 동일한 어셈블리 내에서만 작동합니다.

+0

올바른지는 모르겠지만 두 어셈블리가 "충돌"한다는 사실은 바뀌지 않습니다. 팁을 위해 +1. – Mickel

+0

"Item"클래스가 별도의 어셈블리에 정의되어 있으며 별도로 다른 코드가 포함 된 어셈블리와 다른 의미가 있습니까? –

+0

두 개의 프로젝트 ... EntityFrameworkDataProvider.Item 및 MyApp.Backend.Models (asp.net mvc app)입니다. 별도의 프로젝트 == 별도의 어셈블리 인 경우 확실하지 않은가요? – Mickel

관련 문제