2010-06-14 2 views
7

EntityType 예외로 발견되지 않는 나는 새 레코드를 시도하고 저장할 때이 오류 얻을 :매핑 및 메타 데이터 정보가 나는 마이크로 소프트 엔티티 프레임 워크와 ASP.NET MVC 프레임 워크 2를 시도하고

매핑 및 메타 데이터를 정보 EntityType 'WebUI.Controllers.PersonViewModel'에 대한 찾을 수 없습니다

유형 사람 내보기

내 엔티티 프레임 워크 컨테이너 저장 기록은 강하게 사람 에서 파생 클래스 PersonViewModel에 입력 된. 파생 뷰 모델 클래스를 사용하려고 시도 할 때까지 레코드가 제대로 저장됩니다. 누구든지 내보기 모델을 파생시킬 때 메타 데이터 클래스가 작동하지 않는 이유를 설명 할 수 있습니까? 강하게 유형화 된 모델을 사용할 수 있고 내 스토리지 로직 (EF 클래스) 및 프리젠 테이션 로직 (뷰)을 혼합하지 않고도 데이터 주석 (메타 데이터)을 사용할 수 있기를 원합니다.

// Rest of the Person class is autogenerated by the EF 
[MetadataType(typeof(Person.Metadata))] 
public partial class Person 
{ 
    public sealed class Metadata 
    { 
    [DisplayName("First Name")] 
    [Required(ErrorMessage = "Field [First Name] is required")] 
    public object FirstName { get; set; } 

    [DisplayName("Middle Name")]    
    public object MiddleName { get; set; } 

    [DisplayName("Last Name")] 
    [Required(ErrorMessage = "Field [Last Name] is required")] 
    public object LastName { get; set; } 
    } 
} 

// From the View (PersonCreate.aspx) 
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
     Inherits="System.Web.Mvc.ViewPage<WebUI.Controllers.PersonViewModel>" %> 

// From PersonController.cs 
public class PersonViewModel : Person 
{ 
    public List<SelectListItem> TitleList { get; set; } 
} // end class PersonViewModel 

업데이트 : 여기에 스택 추적입니다 :

 
[InvalidOperationException: Mapping and metadata information could not be found for EntityType 'WebUI.Controllers.PersonViewModel'.] 

System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType) +11531168 

System.Data.Objects.ObjectContext.VerifyRootForAdd(Boolean doAttach, String entitySetName, IEntityWrapper wrappedEntity, EntityEntry existingEntry, EntitySet& entitySet, Boolean& isNoOperation) +195 

System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity) +243 

DomainModel.Entities.MyEntities.AddToPeople(Person person) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Entities\MyEntities.Designer.cs:71 

DomainModel.Concrete.Repository.SavePerson(Person person) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Concrete\Repository.cs:42 

WebUI.Controllers.PersonController.Create(FormCollection form, Int32 hidCancel) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\WebUI\Controllers\PersonController.cs:163 
    lambda_method(Closure , ControllerBase , Object[]) +165 

System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258 

System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext 
controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 

System.Web.Mvc.c__DisplayClassd.b__a() +125 

System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 

System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext 
controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 

System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709 

System.Web.Mvc.Controller.ExecuteCore() +162 

System.Web.Mvc.c__DisplayClass8.b__4() +58 

System.Web.Mvc.Async.c__DisplayClass1.b__0() +20 

System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453 

System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371 

답변

1

난 그냥 비슷한 문제를 했어 MVC3와, (예외에 대한 검색 여기에 나를 인도)하는 왜냐하면 Edmx 파일을 옮겨서 EdmEntityTypeAttribute의 네임 스페이스 속성을 가리켜 야 할 때 혼란 스러웠다.

필자가 설명한 것과 비슷한 구조를 만들었습니다. 즉, 엔티티 유형에서 파생 된 모델 클래스가 있었고 다시 동일한 오류가 발생했습니다. 엔티티 유형에서 파생 클래스로 EdmEntityTypeAttribute를 복사하면 문제가 사라집니다 (최소한 쓰기에는 읽기 문제가 발생합니다). 이것에 의해, 프레임 워크는 아마 리플렉션을 사용해 add 메소드에 건네진 클래스를 조사해, 존재하는 속성을 판정 할 수 있습니다 만, 실제의 형태 (상속 트리는 무시됩니다)에서만 가능합니다.

나는 이것에 대해 생각해 보았고 데이터베이스에서 데이터가 다시 유출된다고 생각하면 실제로는 약간의 의미가 있습니다. 'Person'객체의 목록을 다시 가져 오는 경우 프레임 워크는 어떤 클래스를 만들어 테이블에서 채울 것인지를 결정해야하며 파생 된 Model 클래스를 알지 못하므로 기본 클래스를 만들어야합니다 . 기껏해야, 이것은 읽기를위한 원시 엔티티 유형과 쓰기를위한 모델 유형을 사용하여 스토리지와 상호 작용한다는 것을 의미합니다. 혼동을 야기 할 수 있습니다.

생성 된 엔티티 유형에서 부분 클래스를 사용하면 필요한 경우 엔티티 유형을 확장하거나 엔티티와 모델 유형을 명시 적으로 분리하려는 경우 일종의 오브젝트 맵핑이 필요할 수 있습니다.

물론 엔티티 프레임 워크를 알고 있기 때문에 문제를 둘러싼 또 다른 방법이있을 수 있습니다. 나는이 시점에서 이미 당신을 위해 일하는 해결책을 발견했다고 생각합니다.

1

내게는 * .edmx 파일의 값이 UserAccounts 일 때 실수로 내 데이터베이스에서 내 테이블에 UserAccount 테이블을 호출 한 것이 간단한 문제였습니다. HTH.

관련 문제