2017-10-03 13 views
0

は、私は、次のドメインクラスを持っている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のルールでそれを行うには?

+1

...一箇所ですべてのルールを記述するために私の目的を達しなかった、あなたはないでしょう。 Automapperの仕事は、オブジェクトの新しいインスタンスを作成することです。この場合、 'DbSet'に付けることは、呼び出し元に何をするかを決めることです。私が何かを逃していない限り? – DiskJunky

+0

@DiskJunky、あなたは何かを見逃していません。私はちょうど1つの場所ですべてのルールを持っていたい。 –

+1

個人的には、マップを作成したいが添付したくないとき(たとえば、実際に*挿入したいときなど)にAutomapperバインディングを使用するのが適切だとは思わないでしょう。それは良い考えとして私を攻撃しない – DiskJunky

答えて

1

上記の@DiskJunkyのコメントに同意しますが、ApplicationDriverLicenseクラスでは、EndorsementsCDLTypesタイプの仮想プロパティがあります。オートマッパーはこれらのプロパティを設定しており、コンテキストには関連付けられていないため、EFによって新しいレコードが作成されます。

Auto-Mapper Ignoreこれらの仮想プロパティをマッピングし、それらを空のままにしておくと、問題が解決するはずです。

0

私は道でそれを実装:

public async Task AddApplicationAsync(ApplicationDriverDomain model) 
    { 
     Infrastructure.Asset.ApplicationDriver driver = mapper.Map<Infrastructure.Asset.ApplicationDriver>(model); 

     var cdlTypes = driver.CommercialLicense.CDLTypes; 
     foreach (var type in cdlTypes) 
     { 
      db.ApplicationLicenseCDLTypes.Attach(type); 
     } 

     var endorsements = driver.CommercialLicense.Endorsements; 
     foreach (var endorsement in endorsements) 
     { 
      db.ApplicationLicenseEndorsements.Attach(endorsement); 
     } 

     db.ApplicationDrivers.Add(driver); 
     await db.SaveChangesAsync(); 
    } 

はそう、私は原則として:)