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?
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