2013-01-18 1 views
3

Dans ma base de données, j'ai une table appelée « suivi » avec les colonnes suivantes:Entity Framework: Type « cartographié comme un type complexe » Erreur

[OrderNumber] [varchar](50) NULL, 
[TrackingNumber] [varchar](50) NULL, 
[emailaddress] [varchar](100) NULL, 
[courier] [varchar](10) NULL 

J'ai une classe appelée Tracking pour représenter les entités de la tableau:

public class Tracking 
{ 
    public virtual string OrderNumber { get; set; } 
    public virtual string TrackingNumber { get; set; } 
    public virtual string EmailAddress { get; set; } 
    public virtual string Courier { get; set; } 
} 

Dans la définition de mon contexte de données

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new TrackingConfig()); 
} 

internal class TrackingConfig : EntityTypeConfiguration<Tracking> 
{ 
    internal TrackingConfig() 
    { 
     Property(x => x.OrderNumber); 
     Property(x => x.TrackingNumber); 
     Property(a => a.EmailAddress).HasColumnName("emailaddress"); 
     Property(a => a.Courier).HasColumnName("courier"); 
    } 
} 

Comme vous pouvez le voir, je ne suis pas exp le jeter licitement comme un type complexe. J'ai même utilisé HasColumnName pour spécifier quel nom de colonne correspond à quelle propriété de la classe, juste au cas où il échouerait à les reconnaître en raison des différences de capitalisation. (L'erreur que j'obtiens se produit que HasColumnName soit ou non utilisé, comme il s'avère.)

Lorsque j'appelle le référentiel que j'ai configuré pour une raison quelconque, l'initialisation échoue et Entity Framework lève une exception :

The type 'Tracking' is mapped as a complex type. The Set method, DbSet objects, and DbEntityEntry objects can only be used with entity types, not complex types. 

Je ne suis pas le définir comme un type complexe ... pourquoi traite EF4 comme un?

Répondre

1

On dirait qu'il s'agit de déclarer des champs comme virtuels. Vous pouvez également utiliser des annotations de données pour remplacer les noms de table et de colonne pour correspondre à votre schéma db existant. Voici comment je configurerais le modèle POCO et dbcontext.

[Table("tracking")] 
public class Tracking 
{ 
    public string OrderNumber { get; set; } 
    public string TrackingNumber { get; set; } 

    [Column(Name = "emailaddress")] 
    public string EmailAddress { get; set; } 

    [Column(Name = "courier")] 
    public string Courier { get; set; } 
} 

public class TrackingEntities : DbContext 
{ 
    public DbSet<Tracking> Trackings { get; set; } 
} 
+0

Merci - suppression virtuelle et l'ajout des annotations a fait l'affaire. J'ai aussi remarqué que l'une de mes autres tables avait un schéma autre que "dbo" et que je devais le mettre dans les annotations. – AJH

Questions connexes