Ich habe eine Klasse Product
und einen komplexen Typ AddressDetails
public class Product
{
public Guid Id { get; set; }
public AddressDetails AddressDetails { get; set; }
}
public class AddressDetails
{
public string City { get; set; }
public string Country { get; set; }
// other properties
}
Kann die Zuordnung der "Country" -Eigenschaft aus der AddressDetails
-Klasse in der Product
-Klasse verhindert werden? (weil ich es nie für Product
class brauche)
Etwas wie das
Property(p => p.AddressDetails.Country).Ignore();
Für EF5 und älter: In der DbContext.OnModelCreating
-Überschreibung für Ihren Kontext:
modelBuilder.Entity<Product>().Ignore(p => p.AddressDetails.Country);
Für EF6: Sie haben kein Glück. Siehe Mrchiefs Antwort .
Leider funktioniert die akzeptierte Antwort nicht, zumindest nicht mit EF6 und vor allem, wenn die untergeordnete Klasse keine Entität ist.
Ich habe keinen Weg gefunden, dies über die fließende API zu erreichen. Die einzige Funktionsweise besteht über Datenanmerkungen:
public class AddressDetails
{
public string City { get; set; }
[NotMapped]
public string Country { get; set; }
// other properties
}
Hinweis: Wenn Sie eine Situation haben, in der Country
nur dann ausgeschlossen werden sollte, wenn sie Teil einer anderen Entität ist, dann haben Sie mit diesem Ansatz kein Glück.
Wenn Sie eine Implementierung von EntityTypeConfiguration verwenden, können Sie die Ignore-Methode verwenden:
public class SubscriptionMap: EntityTypeConfiguration<Subscription>
{
// Primary Key
HasKey(p => p.Id)
Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.SubscriptionNumber).IsOptional().HasMaxLength(20);
...
...
Ignore(p => p.SubscriberSignature);
ToTable("Subscriptions");
}
Obwohl mir klar ist, dass dies eine alte Frage ist, lösten die Antworten mein Problem mit EF 6 nicht.
Für EF 6 müssen Sie ein ComplexTypeConfiguration-Mapping erstellen.
beispiel:
public class Workload
{
public int Id { get; set; }
public int ContractId { get; set; }
public WorkloadStatus Status {get; set; }
public Configruation Configuration { get; set; }
}
public class Configuration
{
public int Timeout { get; set; }
public bool SaveResults { get; set; }
public int UnmappedProperty { get; set; }
}
public class WorkloadMap : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Workload>
{
public WorkloadMap()
{
ToTable("Workload");
HasKey(x => x.Id);
}
}
// Here This is where we mange the Configuration
public class ConfigurationMap : ComplexTypeConfiguration<Configuration>
{
ConfigurationMap()
{
Property(x => x.TimeOut).HasColumnName("TimeOut");
Ignore(x => x.UnmappedProperty);
}
}
Wenn Ihr Kontext Konfigurationen manuell lädt, müssen Sie die neue ComplexMap hinzufügen. Wenn Sie die FromAssembly-Überladung verwenden, wird sie von den restlichen Konfigurationsobjekten übernommen.
In EF6 können Sie den komplexen Typ konfigurieren:
modelBuilder.Types<AddressDetails>()
.Configure(c => c.Ignore(p => p.Country))
Auf diese Weise wird die Eigenschaft Country immer ignoriert.
Versuche dies
modelBuilder.ComplexType<AddressDetails>().Ignore(p => p.Country);
In einem ähnlichen Fall hat es für mich funktioniert.