2016-04-18 9 views
0

複雑な型を持つエンティティをDBContext.ChangeTrackerで変更するにはどうすればよいですか?それは私がクライアントの名前を変更する場合は、...のプリミティブでEntity Frameworkの複合型の変更の追跡

モデル...

public class SalesPerson 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Client 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual SalesPerson SalesPerson { get; set; } 
} 

リポジトリ方法...

public void SaveChanges() 
    { 
     var changedItems = _context.ChangeTracker.Entries() 
       .Where(e => e.State != EntityState.Unchanged) 
       .ToList(); 

     foreach (var item in changedItems) 
     { 
       if (item.State == EntityState.Modified) 
       { 
        //Do something 
       } 
      } 
     } 
    } 

だから... ...を正常に動作ChangeTracker(changedItems )は変化を示しています...期待どおりです。

クライアントにセールス担当者を割り当てると、チェンジトラッカーはそれを取得しません。 (EFは複合型の変更を追跡しないため)。

ご協力いただければ幸いです。 @Pawelが正しい方向に私を指摘

+0

エンティティフレームワークは確かに '複合型'を処理します。これは、一般に 'SalesPerson'の娘のテーブルにマップされ、その後、' Client'に戻る関係を持つ別個のエンティティとして追跡されます。しかし、FYI、EFはあなたのすべての変更を保存します。あなたがここで達成しようとしていることを確信していない。 – TheNorthWes

+0

EntityStateが "EntityState.Added"または "EntityState.Modified"のChangeTracker.Entriesから項目を取得しようとしています。 EFはコンプレックスタイプのChangeTrackingをサポートしていないことはかなりよく書かれています – Trenton

+0

これはどこに記載されていますか? 'SalesPerson'はEFコンテキストの一部ではありませんか?なぜそれは 'Client'を追跡するのですが、' SalesPerson'は追跡しません。 – TheNorthWes

答えて

0

...

私はリストを含めるに営業担当者のクラスを変更し、(下記参照)ClientクラスにSalesPersonIdプロパティを追加しました。その後、DbModelBuilder(EFの流暢なAPI)ロジックを追加して、すべてを配線しました。

モデル

public class SalesPerson 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public virtual List<Client> Clients { get; set; } 
} 

public class Client 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual SalesPerson SalesPerson { get; set; } 
    public int? SalesPersonId { get; set; } 
} 

DbContextクラス

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Client>() 
      .HasOptional(e => e.SalesPerson) 
      .WithMany(e => e.Clients) 
      .HasForeignKey(e => e.SalesPersonId); 
    } 

リポジトリは同じまま。 SalesPersonId(プリミティブ)が変更されるため、変更が検出されます。

ありがとう@Pawel

関連する問題