2016-07-31 12 views
2

Ich bekomme den folgenden Fehler, wenn ich versuche, alle Suppliers mit Entity Framework 6.1 zu bekommen.EF: Die Eigenschaft 'Straße' ist keine deklarierte Eigenschaft für den Typ 'Adresse'

Die Eigenschaft 'Straße' ist keine deklarierte Eigenschaft für den Typ 'Adresse'. Vergewissern Sie sich, dass die Eigenschaft nicht explizit aus dem Modell mithilfe der Ignore-Methode oder NotMappedAttribute-Datenannotation ausgeschlossen wurde. Stellen Sie sicher, dass es sich um eine gültige primitive Eigenschaft handelt.

Meine Entitäten wie folgt aussehen:

Supplier.cs:

public class Supplier : AggregateRoot 
{ 
    // public int Id: defined in AggregateRoot class 

    public string CompanyName { get; private set; } 
    public ICollection<Address> Addresses { get; private set; } 

    protected Supplier() { } 

    public Supplier(string companyName) 
    { 
     CompanyName = companyName; 
     Addresses = new List<Address>(); 
    } 

    public void ChangeCompanyName(string newCompanyName) 
    { 
     CompanyName = newCompanyName; 
    } 
} 

Address.cs:

public class Address : ValueObject<Address> 
{ 
    // public int Id: defined in ValueObject class 

    public string Street { get; } 
    public string Number { get; } 
    public string Zipcode { get; } 

    protected Address() { } 

    protected override bool EqualsCore(Address other) 
    { 
     // removed for sake of simplicity 
    } 

    protected override int GetHashCodeCore() 
    { 
     // removed for sake of simplicity 
    } 
} 

Ich habe auch zwei Abbildungen definiert:

SupplierMap .cs

public class SupplierMap : EntityTypeConfiguration<Supplier> 
{ 
    public SupplierMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.Id); 

     // Properties 
     this.Property(t => t.CompanyName).IsRequired(); 
    } 
} 

AddressMap.cs

public class AddressMap : EntityTypeConfiguration<Address> 
{ 
    public AddressMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.Id); 

     // Properties 
     this.Property(t => t.Street).IsRequired().HasMaxLength(50); 
     this.Property(t => t.Number).IsRequired(); 
     this.Property(t => t.Zipcode).IsOptional(); 
    } 
} 

Aber wenn ich den folgenden Code ausführen ich gebe mir den oben beschriebenen Fehler:

using (var ctx = new DDDv1Context()) 
{ 
    var aaa = ctx.Suppliers.First(); // Error here... 
} 

Der Code funktioniert, wenn ich die ICollection aus der Supplier.cs Klasse entfernen und entfernen Sie auch die Mapping-Klasse aus meinem DB-Kontext:

public class DDDv1Context : DbContext 
{ 
    static DDDv1Context() 
    { 
     Database.SetInitializer<DDDv1Context>(null); 
    } 

    public DbSet<Supplier> Suppliers { get; set; } 
    public DbSet<Address> Addresses { get; set; } //Can leave this without problems 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     modelBuilder.Configurations.Add(new SupplierMap()); 

     // Now code works when trying to get supplier 
     //modelBuilder.Configurations.Add(new AddressMap()); 
    } 

} 

Warum gibt der Code einen Fehler, wenn ich versuche, es mit der Address Klasse und AddresMap Klasse zu verwenden?

Antwort

5

Ihre Street-Eigenschaft ist unveränderlich, sie muss einen Setter haben, damit Ihr Code funktioniert. Momentan haben Sie keinen Setter, der auf Street definiert ist, und deshalb erhalten Sie den Fehler.

+0

Danke, das war das Problem. Die Klasse "Address" ist jedoch ein "ValueObject" und sollte unveränderlich sein. Um dieses Problem zu lösen, habe ich jeder Eigenschaft statt einer öffentlichen eine geschützte Gruppe hinzugefügt. Das scheint der Trick zu sein. – w00