webentwicklung-frage-antwort-db.com.de

EF-Code Verhindern Sie zunächst die Zuordnung von Eigenschaften mit der Fluent-API

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();
28
Catalin

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 .

25
Twon-ha

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.

15
Mrchief

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");
}
6
JAVizcaino

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.

3
Salizar Marxx

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.

2
davidfcruz

Versuche dies

modelBuilder.ComplexType<AddressDetails>().Ignore(p => p.Country);

In einem ähnlichen Fall hat es für mich funktioniert.

1
Jan