2011-01-05 3 views
5

Ich erhalte eine ModelValidationException (ganz unten), wenn ich mit "EF-Code First" arbeite. Es will mir einen Schlüssel definieren, aber ich bin nicht sicher, was genau bedeutet es ...Wie definiere ich Keys, wenn ich mit "EF-Code First" arbeite?

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: Eine oder mehrere Validierungsfehler während der Modellerzeugung erfasst wurden:

System.Data.Edm.EdmEntityType:: EntityType 'Einheit' hat keinen Schlüssel definiert. Definieren Sie den Schlüssel für diesen EntityType.

System.Data.Edm.EdmEntitySet: EntityType: Die EntitySet-Einheiten basieren auf dem Typ Einheit, für den keine Schlüssel definiert sind.

Antwort

3

Sie müssen Eigenschaften verwenden, nicht private lokale Variablen für alle Felder, die Sie EF für Datenbankfelder erstellen möchten.

Öffentliche Guid Id {get; set;}

8

Ihre Felder Eigenschaften machen, und verwenden Sie dann die [Key] Attribut wie folgt aus:

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

Sie müssen wird referenzieren und Import System.ComponentModel.DataAnnotations die KeyAttribute zu bekommen. More info can be found here.

+1

EF klassifiziert Eigenschaften automatisch mit dem Suffix "Id" (beachten Sie den Kleinbuchstaben "d") als Schlüssel. Es empfiehlt sich, der Konvention zu folgen, anstatt Felder manuell als Schlüssel zuzuordnen. – Charlie

0

Ohne [Schlüssel] zu verwenden, wenn Sie Ihren Spaltennamen als public Guid UnitID {get; einstellen; } dann EF betrachtet diese Spalte als Schlüsselspalte.