2011-01-05 5 views
5

Je reçois une exception ModelValidationException (en bas) lorsque je travaille avec "EF-Code First". Il veut définir une clé, mais je ne sais pas exactement ce que cela signifie ...Comment définir les touches lorsque je travaille avec "EF-Code First"?

public class Unit 
{ 
    Guid id; 
    String public_id; 
    String name;   
    bool deleted; 
} 

public class MyDataContext : DbContext 
{ 
    public DbSet<Unit> Units { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Unit>().ToTable("sometable"); 
    } 
} 

[TestFixture] 
public class DataTests 
{ 
    [Test] 
    public void Test() 
    { 
     MyDataContext database = new MyDataContext(); 
     var o = database.Units; 


     Console.WriteLine(o.Count()); // This line throws! 
     Assert.IsTrue(true); 
    } 
} 

System.Data.Entity.ModelConfiguration.ModelValidationException: Une ou plusieurs erreurs de validation ont été détectées lors de la génération de modèle:

System.Data.Edm.EdmEntityType:: EntityType 'Unité' n'a pas de clé définie. Définissez la clé pour cet EntityType.

System.Data.Edm.EdmEntitySet: EntityType: EntitySet Units est basé sur le type Unité qui n'a aucune clé définie.

Répondre

3

Vous devez utiliser des propriétés et non des variables locales privées pour tous les champs pour lesquels EF doit créer des champs de base de données.

Public Guid Id {get; ensemble;}

8

Faites vos champs de propriétés, puis utilisez l'attribut [Key] comme ceci:

[Key] 
public Guid MyId { get; set; } 

Vous devrez faire référence et System.ComponentModel.DataAnnotations à l'importation pour obtenir le KeyAttribute. More info can be found here.

+1

EF classera automatiquement les propriétés avec le suffixe "Id" (notez le 'd' minuscule) comme clés. Il est préférable de suivre la convention plutôt que d'attribuer manuellement des champs en tant que clés. – Charlie

0

Sans utiliser [Key] si vous utilisez le nom de colonne public Guid UnitID {get; ensemble; } puis EF considère cette colonne comme colonne de clé.

Questions connexes