2017-05-04 12 views
0

私は数多くのテーブルを含むpostgresデータベースを持っています。このプロジェクトは、Entity Frameworkを使用して実装されています。Entity Frameworkのベースデータベーステーブルに影響を与えずにオブジェクトを変更できますか?

私は3つのデータベースクラスを持っています。A、B &と言うことができます。クラスAには、Bのオブジェクトのリストが含まれています。クラスBは、Cのオブジェクトのリストを含む。クラスCは、いくつかのフィールドを含む単純なクラスです。

[Table("A")] 
public class A: GUIDModelBase 
{.... 
} 

データは以下のように満たされている:いくつかの特定の要件については

Parent1 [A] 
    -Child1 [B] 
     --Grandchild1 [C] 
     --Grandchild2 [C] 
    -Child2 [B] 
     --Grandchild3 [C] 
     --Grandchild4 [C] 

を、 私はAPIを使用してオブジェクトAにテーブルのデータを取得する

これらのクラスの始まりは、次のようになり以下のようになります。

A AObj = commonDbService.ARepository.GetAById(A.Id); 

GetAByIdはdbseトン以下のように:

protected DbSet<TEntity> dbset = null; 
public Project GetAById(Guid id) 
{ 
    return dbset.Include(x => x.CoordinateSystem) 
     .SingleOrDefault(p => p.Id == id); 
} 

私が操作したいと以下のように別のクラスのオブジェクトにAOBJのデータを保存する(いけないGrandchild2とGrandchild4を持つようにしたい):でも、私はこれを行うと、

MigrationData md = new MigrationData(); 
md.ANewObj = Manipulate(AObj); //Removes two grandchildren elements 

AObjも完全に変更されます。 AObjとデータベーステーブルに完全なデータがそのまま残っている必要があります(ただし、アプリケーションを再起動するまで一時的に)。表のデータは、UIページの1つに表示されます。上の行のように修正されるとすぐに、UIページに残っているのは2人の孫だけです。しかし、私がアプリケーションを再起動すると、すべての孫がデータベースに存在します。

このため、ベースデータベーステーブルを変更しなければ、個別に変更することはできません。 これは誰でも手伝ってもらえますか?

+0

[Entity Frameworkコードファーストでオブジェクトをデタッチするにはどうすればよいですか?](http://stackoverflow.com/questions/5599147/how-do-i-detach-objects-inentity-framework-code-最初に) – Gusman

+0

@Gusman:上記の共有リンクのように親オブジェクトを切り離すために両方の方法を試してみました。しかし、私がデタッチするかAsNoTrackingするとすぐに、すべての子オブジェクトが完全に削除されます。親とそのフィールドだけが元のままで、子カウントは0になります。私はすべてのデータをオブジェクトにそのまま残し、このオブジェクトにさらに変更してデータベースに影響を与えないようにします。私は解決策に近づいているように見えるが、それを働かせることはできない。これを正確に行う方法についてもっと教えてもらえますか?ありがとう。 – vinmm

+0

子要素をクエリに含めましたか?デフォルトでそれらをインクルードしないと、EFは遅延ロードを行い、オブジェクトがデタッチされるとそれを使用することはできません。私はあなたが明示的にそれらが保存される下位要素を含めると思います。それ以外の場合は、まず子要素を切り離してから、ルートオブジェクトを切り離してください。 – Gusman

答えて

1

短い答えは、オブジェクトの操作が実際に何をするかによって異なります。コンテキストにアタッチされているオブジェクトを変更している場合は、Entity Frameworkはオブジェクトを変更したものとして表示し、SaveChangesを呼び出すとオブジェクトを更新します。分離したいオブジェクトをデタッチして、自由に操作できるようにするか、変更せずに新しいオブジェクトにマップ/クローンします。

+0

私が上で述べたように、操作は、grandchild2とgrandchild4を削除するような、親のリストから少数のオブジェクトを取り除くことを含む。私はデタッチを使ってみました。そのオブジェクトをデタッチすると、その子アイテムと孫アイテムはすべて削除されています。親のフィールドと値のみが保持されます。親オブジェクト内のすべてのデータを保持しながら、どのように切り離して使用する必要がありますか?私にお知らせください。 – vinmm

+0

右の親エンティティだけを切り離すと、子は自動的に切り離されません。私もAsNoTrackingを提案していましたが、私はそれがうまくいかないとあなたに困惑しています。これは、以前のクエリのコンテキスト内に子オブジェクトがない限り、通常のバージョンと同じように動作するはずです。 EFは自動的に関係を修正します。すべての子エンティティを含むクエリAsNoTrackingを実行して、それがうまくいくと思います。 –

+0

ちょっと気付いたのは、子どもの親のオブジェクトと孫のオブジェクトの子のリストのいくつかのネストされたリストがあり、grandgrandchildクラスのいくつかのリストもあります。毎回すべてを個別に切り離すのは非常に難しいでしょう。私の問題の解決策があるとは思わない – vinmm

関連する問題