2009-06-17 8 views
4

私は、作業している個々のオブジェクトを知らなくてもLINQ to SQLレイヤーを使ってデータを操作できるクラスを作成しています。これまでのところ、選択と挿入をカスケードするためにはうまく動作しますが、更新には苦労しています。私は更新の一部として子オブジェクトを持つまでLINQ to SQLと子オブジェクトの添付

if ((long)entity.GetType().GetProperty(GetPrimaryKeyName(entity)).GetValue(entity, null) == 0) 
      { 
       Context.GetTable(entity.GetType()).InsertOnSubmit(entity); 
      } 
      else 
      { 
       Context.GetTable(entity.GetType()).Attach(entity, true); 
      } 

      foreach (PropertyInfo property in entity.GetType().GetProperties()) 
      { 
       if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(EntitySet<>)) 
       { 
        IEnumerable children = (IEnumerable)property.GetValue(entity, null); 
        foreach (object child in children) 
        { 
         Save(child); 
        } 
       } 
      } 

これは動作します:

は、ここで私が使用している保存方法です。たとえば、更新する必要があり挿入されていないAddress子オブジェクトを持つCustomerオブジェクトを渡すと、Customerオブジェクトをアタッチするとすぐに、EntitySetに2つのAddressオブジェクトがあります.1つはデータベースからプルアップされ、新しいもの最初のAddress子オブジェクトをアタッチしようとすると、「既に存在するエンティティをアタッチできません」という例外が発生します。

アイデア?

答えて

2

親エンティティを添付する前に子エンティティを添付することは可能でしょうか?アタッチの問題を回避できますか?

EntityRefオブジェクトをすべて取得するには、反射を使用して、それぞれのEntityプロパティを適切な表に追加します。

+0

私はちょうどそれをやってしまった、あなたは正しい。 「ボトムアップ」からアタッチすると問題が解決しました。 –

関連する問題