は、私は、次のドメインクラスを持っているEFとAutomapper
[Table("ApplicationLicenseCDLTypes")]
public partial class ApplicationLicenseCDLType
{
public ApplicationLicenseCDLType()
{
ApplicationDriverLicenses = new HashSet<ApplicationDriverLicense>();
}
public int Id { get; set; }
[Required]
[StringLength(256)]
public string Name { get; set; }
public virtual ICollection<ApplicationDriverLicense> ApplicationDriverLicenses { get; set; }
}
[Table("ApplicationLicenseEndorsements")]
public partial class ApplicationLicenseEndorsement
{
public ApplicationLicenseEndorsement()
{
ApplicationDriverLicenses = new HashSet<ApplicationDriverLicense>();
}
public int Id { get; set; }
[Required]
[StringLength(256)]
public string Name { get; set; }
public virtual ICollection<ApplicationDriverLicense> ApplicationDriverLicenses { get; set; }
}
[Table("ApplicationDriverLicenses")]
public partial class ApplicationDriverLicense
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public ApplicationDriverLicense()
{
CDLTypes = new HashSet<ApplicationLicenseCDLType>();
Endorsements = new HashSet<ApplicationLicenseEndorsement>();
}
[Required]
[StringLength(256)]
public string Name { get; set; }
[Key, ForeignKey("Driver")]
public int DriverId { get; set; }
public virtual ApplicationDriver Driver { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ApplicationLicenseCDLType> CDLTypes { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ApplicationLicenseEndorsement> Endorsements { get; set; }
}
はまた、選択されたCDLTypes /裏書
modelBuilder.Entity<ApplicationDriverLicense>()
.HasMany(e => e.CDLTypes)
.WithMany(e => e.ApplicationDriverLicenses)
.Map(m => m.ToTable("ApplicationDriverLicenseCDLTypes").MapLeftKey("DriverId").MapRightKey("TypeId"));
modelBuilder.Entity<ApplicationDriverLicense>()
.HasMany(e => e.Endorsements)
.WithMany(e => e.ApplicationDriverLicenses)
.Map(m => m.ToTable("ApplicationDriverLicenseEndorsements").MapLeftKey("DriverId").MapRightKey("TypeId"));
を格納するための2つの追加のテーブルがあります
次に、ドメインクラスをEFクラスにマップします。
CreateMap<ApplicationDriverLicenseDomain, Infrastructure.Asset.ApplicationDriverLicense>();
CreateMap<ApplicationLicenseEndorsementDomain, Infrastructure.Asset.ApplicationLicenseEndorsement>();
CreateMap<ApplicationLicenseCDLTypeDomain, Infrastructure.Asset.ApplicationLicenseCDLType>();
が、私はDBにレコードを追加しよう:
public async Task AddApplicationAsync(ApplicationDriverDomain model)
{
Infrastructure.Asset.ApplicationDriver driver = mapper.Map<Infrastructure.Asset.ApplicationDriver>(model);
db.ApplicationDrivers.Add(driver);
await db.SaveChangesAsync();
}
それが現在入手してCDLタイプ/裏書のための新しいレコードを追加する代わりに。私が理解するように、私は「アタッチ」を行うべきです。 Automapperのルールでそれを行うには?
...一箇所ですべてのルールを記述するために私の目的を達しなかった、あなたはないでしょう。 Automapperの仕事は、オブジェクトの新しいインスタンスを作成することです。この場合、 'DbSet'に付けることは、呼び出し元に何をするかを決めることです。私が何かを逃していない限り? – DiskJunky
@DiskJunky、あなたは何かを見逃していません。私はちょうど1つの場所ですべてのルールを持っていたい。 –
個人的には、マップを作成したいが添付したくないとき(たとえば、実際に*挿入したいときなど)にAutomapperバインディングを使用するのが適切だとは思わないでしょう。それは良い考えとして私を攻撃しない – DiskJunky