Die Schlüsselkomponente 'Id' ist keine deklarierte Eigenschaft des Typs 'TypeName', wenn die Basisklasse und der private Setter verwendet werden

Ich möchte eine abstrakte Basisklasse für Entitäten verwenden, die keiner Tabelle zugeordnet ist:

public abstract class Entity
{
    public virtual int Id { get; private set; }
}

Schon seitId wird automatisch inkrementiert, ich möchte nicht zulassen, dass diese Eigenschaft von außen geändert wird. Daher ist sein Setterprivate.

Hier ist ein Beispiel für einen Entitätstyp:

public class Order : Entity
{
    public virtual string Customer { get; set; }
}

... Konfigurationstypen:

public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : Entity
{
    public EntityConfiguration()
    {
        HasKey(o => o.Id);
        Property(o => o.Id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

public class OrderConfiguration : EntityConfiguration<Order>
{
    public OrderConfiguration()
    {
        Property(o => o.Customer).HasColumnName("customer");
        ToTable("Customers");
    }
}

... und Kontext:

public class Context : DbContext
{
    public Context()
        : base()
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new OrderConfiguration());
    }

    public DbSet<Order> Orders { get; set; }
}

Wenn ich jetzt versuche, Aufträge wie diesen abzufragen:

        using (var context = new Context())
        {
            foreach (var order in context.Orders)
            {
                Console.WriteLine(order.Customer);
            }
        }

Ich bekomme eine Ausnahme:

Die Schlüsselkomponente 'Id' ist keine deklarierte Eigenschaft des Typs 'Order'. Stellen Sie sicher, dass es nicht explizit aus dem Modell ausgeschlossen wurde und dass es sich um eine gültige primitive Eigenschaft handelt.

Ich habe mehrere Fragen bei SO gelesen und festgestellt, dass mein Ansatz korrekt aussieht. Dann habe ich die Basisklasse ein wenig modifiziert und gemachtId mitÖffentlichkeit Setter:

public abstract class Entity
{
    public virtual int Id { get; set; }
}

Und (es ist ein Wunder!) Der Beispielcode funktioniert gut. Auch ohne Sockel funktioniert es einwandfreiEntity Klasse (wennId ist definiert inOrder) mit privatem Setter.

Logik sagt mir, das ist ein fehlerhaftes Verhalten von EF.
Aber vielleicht fehlt mir etwas?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage