2011-06-20 4 views
0

je classe comme celui-ciEntity Framework premier ne fonctionne pas

class ClassA 
    { 
     public long classAID {get; set;} 
     public string Description {get; set;} 
     public IEnumerable<ClassB> ClassBs {get; set;} 

    } 

class ClassB 
    { 
     pubic long classBID {get; set;} 
     public string SomeOtherDescription {get; set;} 

     public IEnumerable<ClassA> {get; set;} 
    } 
class TestContext: DBContext 
    { 
     public DbSet<ClassA> ClassAs { get; set; } 
     public DbSet<ClassB> ClassBs { get; set; } 
    } 

H ont la DB avec les mêmes noms de colonnes et les noms de table que les classes et les propriétés. J'ai effectué la configuration web.config comme requis. Quand je tente d'utiliser ci-dessus pour récupérer les données que je reçois l'erreur

"System.Data.Edm.EdmEntityType: : EntityType 'ClassA' has no key defined. Define the key for this EntityType." 

et

"System.Data.Edm.EdmEntityType: : EntityType 'ClassB' has no key defined. Define the key for this EntityType." 

Je fatigué plusieurs approches telles que la définition de l'attribut clé, attribut clé étrangère, etc., mais rien ne fonctionnait. S'il vous plaît laissez-moi savoir ce qui me manque.

J'utilise C# 4 et moi avons vérifié avec les URL suivantes:
http://www.asp.net/mvc/tutorials/mvc-music-store-part-4

http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

+0

Les tables de db ont-elles des clés primaires correctement définies? – pRimE

+0

Oui, j'ai des clés primaires définies. classAID et classBID sont des clés primaires et tableB a l'attribut classAID qui est un FK – Amit

+0

Le code que vous avez publié fonctionne comme prévu, donc il doit y avoir un problème ailleurs. –

Répondre

0

Utilisez ceci:

public class ClassA 
{ 
    public long ClassAID {get; set;} 
    public string Description {get; set;} 
    public virtual ICollection<ClassB> ClassBs {get; set;} 
} 

public class ClassB 
{ 
    public long ClassBID {get; set;} 
    public string SomeOtherDescription {get; set;} 
    public virtual ICollection<ClassA> {get; set;} 
} 

public class TestContext: DBContext 
{ 
    public DbSet<ClassA> ClassAs { get; set; } 
    public DbSet<ClassB> ClassBs { get; set; } 
} 

Comme vous pouvez voir les propriétés de navigation sont marqués comme virtual. Il permettra le chargement paresseux = la propriété de navigation sera chargée séparément la première fois que votre code accède à la propriété. Ce n'est pas toujours le meilleur moyen de charger les propriétés de navigation de cette façon car cela provoque des allers-retours supplémentaires à la base de données. A cause de cela, EF propose également un chargement anticipé où vous chargez explicitement EF de charger votre propriété de navigation:

var query = context.ClassAs.Include(c => ClassBs); 
+0

En fait, je ne pouvais pas obtenir le travail ci-dessus. :(J'ai généré les classes de ma base de données en utilisant EF power tools (http://goo.gl/5NiuH) Maintenant, ça marche bien – Amit

+0

Et quelle était la différence entre le code que vous avez essayé et le code que l'outil a généré pour vous? –

Questions connexes