web-dev-qa-db-ja.com

EF Code Firstは、Fluent APIによるプロパティマッピングを防止します

クラスProductと複合型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
}

AddressDetailsクラス内のProductから「Country」プロパティのマッピングを防ぐことはできますか? (Productクラスには必要ないため)

このようなもの

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

EF5以前の場合:DbContext.OnModelCreatingコンテキストのオーバーライド:

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

EF6の場合:運が悪い。 Mrchief's answer を参照してください。

27
Twon-ha

残念ながら、受け入れられた答えは、少なくともEF6では、特に子クラスがエンティティでない場合は機能しません。

Fluent APIを使用してこれを行う方法はまだ見つかりません。これが機能する唯一の方法は、データ注釈を使用することです。

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

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

注:Countryが他の特定のエンティティーの一部である場合にのみ除外する必要がある場合、このアプローチはうまくいきません。

15
Mrchief

EntityTypeConfigurationの実装を使用している場合は、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

これは古い質問であることがわかりましたが、回答でEF 6の問題が解決されませんでした。

EF 6の場合、ComplexTypeConfigurationマッピングを作成する必要があります。

例:

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

コンテキストが構成を手動でロードしている場合は、新しいComplexMapを追加する必要があります。FromAssemblyオーバーロードを使用している場合は、残りの構成オブジェクトでピックアップされます。

3
Salizar Marxx

EF6では、複合タイプを構成できます。

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

そうすれば、プロパティCountryは常に無視されます。

2
davidfcruz

これを試して

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

似たようなケースでうまくいきました。

1
Jan