web-dev-qa-db-fra.com

EF Code First empêche le mappage de propriété avec l'API Fluent

J'ai une classe Product et un type complexe 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
}

Est-il possible d'empêcher le mappage de la propriété "Pays" de AddressDetails dans la classe Product? (parce que je n'en aurai jamais besoin pour la classe Product)

Quelque chose comme ça

Property(p => p.AddressDetails.Country).Ignore();
28
Catalin

Pour EF5 et plus ancien: Dans le DbContext.OnModelCreating, remplacez pour votre contexte:

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

Pour EF6: Vous n'avez pas de chance. Voir Réponse de Mrchief .

25
Twon-ha

Malheureusement, la réponse acceptée ne fonctionne pas, pas du moins avec EF6 et surtout si la classe enfant n'est pas une entité.

Je n'ai trouvé aucun moyen de le faire via une API fluide. Cela fonctionne uniquement via des annotations de données:

public class AddressDetails
{
    public string City { get; set; }

    [NotMapped]
    public string Country { get; set; }
    // other properties
}

Remarque: Si vous avez une situation dans laquelle Country ne devrait être exclu que si elle fait partie d'une autre entité, vous n'avez pas de chance avec cette approche.

15
Mrchief

Si vous utilisez une implémentation de EntityTypeConfiguration, vous pouvez utiliser la méthode Ignore:

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

Bien que je sache que c’est une vieille question, les réponses n’ont pas résolu mon problème avec EF 6.

Pour EF 6, vous devez créer un mappage ComplexTypeConfiguration.

exemple:

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);
    }
}

Si votre contexte charge des configurations manuellement, vous devez ajouter le nouveau ComplexMap. Si vous utilisez la surcharge FromAssembly, il sera repris avec le reste des objets de configuration.

3
Salizar Marxx

Sur EF6, vous pouvez configurer le type de complexe:

 modelBuilder.Types<AddressDetails>()
     .Configure(c => c.Ignore(p => p.Country))

De cette façon, la propriété Pays sera toujours ignorée.

2
davidfcruz

Essaye ça

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

Cela a fonctionné pour moi dans un cas similaire.

1
Jan