2010-06-22 10 views
3

J'utilise EF 4.0 et POCO. Je suis tombé sur cette erreur lors de l'insertion d'enregistrements dans la base de données.EF 4.0 Dynamic Proxies Objet POCO Ne correspond pas au type de cible

L'accesseur de propriété 'QualityReasonID' sur l'objet 'BI.Entities.QualityReason' a émis l'exception suivante: 'L'objet ne correspond pas au type de cible.'

Des erreurs se produisent sur le Databind à un GridView après avoir enregistré un nouvel enregistrement à la base de données. J'ai identifié ce qui se passe mais je ne suis pas sûr de savoir pourquoi cela se produit ou si j'utilise incorrectement EF/POCO. Toute idée serait appréciée.

L'exception se produit car les types d'objet dans IEnumerable ne sont pas identiques. Les entrées initiales de la table sont de type System.Data.Entity.DynamicProxies.QualityReason_E483AD567288B459706092F1825F53B1F93C65C5329F8095DD1D848B5D039F04} alors que la nouvelle est BI.Entities.QuailtyReason.

Voici comment j'insère le nouvel objet.

public void createQualityReason(QualityReason qReasons) 
    { 
     dbcontext.QualityReasons.AddObject(qReasons); 
     dbcontext.SaveChanges(); 
    } 

Je résolu l'erreur en changeant la récupération du code de:

public IEnumerable<QualityReason> fetchQualityReasons() 
    { 

     IEnumerable<QualityReason> queryReasons = dbcontext.QualityReasons.AsEnumerable(); 
     return queryReasons; 
    } 

à

public IEnumerable<QualityReason> fetchQualityReasons() 
    { 

     IEnumerable<QualityReason> queryReasons = from data in dbcontext.QualityReasons.AsEnumerable() 
       select new QualityReason 
       { 
        QualityReasonID = data.QualityReasonID, 
        QualityReasonName = data.QualityReasonName 
       }; 
        return queryReasons; 
    } 

Donc, pour contourner l'erreur, je dois sélectionner dans la classe POCO explicitement chaque fois . C'est comme si je me trompais. Des pensées?

+0

Je pense la question peut avoir plus à voir avec le gridview et la liaison de données que l'EF. –

Répondre

1

Je ne sais pas si le problème a déjà été résolu, mais j'ai eu le même problème avec ma classe "Scénario" (POCO).

Le problème a disparu lors de l'utilisation d'un context.CreateObject<Scenario> pour créer l'objet (POCO) i.s.o. a .... = nouveau scénario().

2

L'erreur est due au fait que GridView ne gère pas les sources de données polymorphes lors de l'utilisation de boundfields. Donc, vous avez deux options

  1. Utiliser TemplateFields au lieu qui peut gérer les sources de données polymorphes, cela peut avoir modifié certaines de votre code d'extrémité avant et événements GridView.

  2. Utilisez LINQ pour créer un databsource non polymorphes que les BoundFields peuvent gérer

    So instead of using something like ti 
    
        gvGroups.DataSource = ProductHelper.Get() 
        gvGroups.DataBind(); 
    
    
    
        var query = from p in ProductHelper.Get() 
        select new {p.ProductId, p.ProductName, p.ProductDesc, p.ProductLink}; 
        gvGroups.DataSource = query; 
        gvGroups.DataBind(); 
    
1

faisait face à la même question aujourd'hui et utilisé Value Injecter pour le résoudre. Il est aussi simple que:

var dynamicProxyMember = _repository.FindOne<Member>(m=>m.Id = 1); 
var member = new Member().InjectFrom(dynamicProxyMember) as Member; 

Ca y est :)

Questions connexes