2010-06-14 21 views
7

EntityType İstisna için bulunamadı ve yeni kayıtlar denemek ve kaydederken bu hatayı alıyorum:Haritalama ve meta veri bilgileri Microsoft Entity Framework ile ASP.NET MVC Framework 2 dışarı çalışıyorum

Haritalama ve meta bilgi EntityType 'WebUI.Controllers.PersonViewModel' için bulunamadı

tip Kişi ve benim bakış ait

benim varlık Framework konteyner depoları kayıtları kuvvetle Kişi türetilmiş sınıfın PersonViewModel ile yazılan. Türetilmiş görünüm modeli sınıfını kullanmaya çalışana kadar kayıtlar düzgün bir şekilde kaydedildi. Görünüm modelimi türettiğimde metadata sınıfının neden çalışmadığını herkes anlatabilir mi? Güçlü yazılan bir model kullanabilmek ve ayrıca depolama mantığımı (EF sınıfları) ve sunum mantığını (görünümleri) karıştırmaya başvurmadan veri ek açıklamalarını (meta veri) kullanabilmeyi istiyorum.

// 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 

Güncelleme: Burada Yığın izleme:

 
[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 

cevap

1

Sadece benzer bir sorun yaşadım MVC3 ile, (istisna için bir arama beni buraya getirmesi) hangi Benim için edmx dosyamı taşıdığı ve EdmEntityTypeAttribute ad alanı özniteliğinin nereye işaret etmesi gerektiği konusunda kafam karışmış olduğu için çıktı.

Tanımladığınıza benzer bir yapı yapıyorum, böylece bir varlık türünden türeyen bir model sınıfım vardı ve yine aynı hatayı aldım. EdmEntityTypeAttribute öğesinden türetilmiş sınıfa kopyalanırsam, sorun gider (en azından yazarken okuma konusunda farklı bir sorunla karşılaşırsınız). Bu, çerçevenin muhtemelen ekleme yöntemine geçirilen sınıfı sorgulamak için yansıma kullanmak olduğuna, hangi özniteliklerin bulunduğunu belirlemek için olduğuna, ancak yalnızca gerçek türüne (kalıtım ağacının göz ardı edildiğine) inanmamı sağlar.

Bunu düşündüm ve veri tabanından veri akışı hakkında düşünürseniz aslında biraz mantıklı. Eğer 'Kişi' nesnelerinin bir listesini geri getirecekseniz, çerçevenin tablodan hangi sınıfın oluşturulacağı ve doldurulacağına karar vermesi gerekir ve türetilmiş Model sınıfınız hakkında bilgi sahibi olmaz, bu yüzden temel sınıfı oluşturması gerekir . En iyi ihtimalle, bu, okuma için ham varlık türlerini ve yazma için model türleri kullanarak depolama ile etkileşim kurduğunuz anlamına gelir, ki bu kafa karıştırıcı gibi görünür.

Oluşturulan varlık türlerinde kısmi sınıfların kullanılması, gerekiyorsa bunları genişletmenize veya varlık ve model türlerini açıkça ayırmak isterseniz, bir çeşit nesne eşlemesi gerekebilir.

Elbette, varlık çerçevesini hala öğreniyorum, bu yüzden problemin başka bir yolu da olabilir. Bu noktada, sizin için çalışan bir çözüm buldunuz.

1

Benim için * .edmx dosyasındaki değer UserAccounts olduğunda, benim veritabanı UserAccount tablomu çağırdı basit bir sorun oldu. HTH.