クラス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();
EF5以前の場合:DbContext.OnModelCreating
コンテキストのオーバーライド:
modelBuilder.Entity<Product>().Ignore(p => p.AddressDetails.Country);
EF6の場合:運が悪い。 Mrchief's answer を参照してください。
残念ながら、受け入れられた答えは、少なくともEF6では、特に子クラスがエンティティでない場合は機能しません。
Fluent APIを使用してこれを行う方法はまだ見つかりません。これが機能する唯一の方法は、データ注釈を使用することです。
public class AddressDetails
{
public string City { get; set; }
[NotMapped]
public string Country { get; set; }
// other properties
}
注:Country
が他の特定のエンティティーの一部である場合にのみ除外する必要がある場合、このアプローチはうまくいきません。
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");
}
これは古い質問であることがわかりましたが、回答で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オーバーロードを使用している場合は、残りの構成オブジェクトでピックアップされます。
EF6では、複合タイプを構成できます。
modelBuilder.Types<AddressDetails>()
.Configure(c => c.Ignore(p => p.Country))
そうすれば、プロパティCountryは常に無視されます。
これを試して
modelBuilder.ComplexType<AddressDetails>().Ignore(p => p.Country);
似たようなケースでうまくいきました。