2016-06-19 12 views
0

私のデータベースに1対多の関係があります。コレクション内のすべてのオブジェクトを汎用メソッドで更新しようとしています。多重度制約に違反しています。関係のロール ''には、多重度1または0..1があります。

public static void DuplicateItem<T>(T dataBaseItem, T origionalItem) 
    { 
     var type = origionalItem.GetType(); 
     var properties = type.GetProperties(); 
     var databasePropertyInfo = dataBaseItem.GetType(); 
     foreach (var origionalProperty in properties) 
     { 
      var n = origionalProperty.Name; 
      var databaseProperty = databasePropertyInfo.GetProperty(origionalProperty.Name); 
      if(IsComplex(origionalProperty.GetValue(origionalItem,null))) 
       continue; 

      var origionalValue = origionalProperty.GetValue(origionalItem, null); 
      var t = Nullable.GetUnderlyingType(origionalProperty.PropertyType) 
       ?? origionalProperty.PropertyType; 
      var saveValue = (origionalValue == null) ? null : Convert.ChangeType(origionalValue, t); 
      databaseProperty.SetValue(dataBaseItem, saveValue); 
     } 
    } 

このメソッドは、コレクションを除いて非常に機能します。 originalItem.CollectionからdatabaseItem.Colletionまでのアイテムを単に追加するだけで、私がこの控除を通じて私にしなければならないアイテムの量を2倍にすることになります。私が欲しいのは、すべての子供をdatabaseItem.CollectionからoriganalItem.Collectionに更新するだけです。

だから私は変更を作ってみました:

public static void DuplicateItem<T>(T dataBaseItem, T origionalItem) 
    { 
     var type = origionalItem.GetType(); 
     var properties = type.GetProperties(); 
     var databasePropertyInfo = dataBaseItem.GetType(); 
     foreach (var origionalProperty in properties) 
     { 
      var n = origionalProperty.Name; 
      var databaseProperty = databasePropertyInfo.GetProperty(origionalProperty.Name); 
      if(IsComplex(origionalProperty.GetValue(origionalItem,null))) 
       continue; 
      if (IsCollection(origionalProperty.GetValue(origionalItem, null))) 
      { 
       ClearItems(databaseProperty.GetValue(dataBaseItem,null), 
        origionalProperty.GetValue(origionalItem, null)); 
      } 
      var origionalValue = origionalProperty.GetValue(origionalItem, null); 
      var t = Nullable.GetUnderlyingType(origionalProperty.PropertyType) 
       ?? origionalProperty.PropertyType; 
      var saveValue = (origionalValue == null) ? null : Convert.ChangeType(origionalValue, t); 
      databaseProperty.SetValue(dataBaseItem, saveValue); 
     } 
    } 

とClearItems:

private static void ClearItems(object databaseValue, object newvalue) 
    { 
     var l = databaseValue as IEnumerable<object>; 
     var n = newvalue as IEnumerable<object>; 
     if (l != null) 
     { 
      for (int i = 0; i < l.Count(); i++) 
      { 
       var dItem = l.ToList()[i]; 
       var nItem = n.ToList()[i]; 
       DuplicateItem(dItem,nItem); 
      } 

     } 
    } 

これが今私にだけ3アイテムを与えるが、私はまだ例外をスローしています。 これで私の質問 ClearItems<TDatabase,TOriganial>を使って、コレクション内のすべてのアイテムとコレクション内のすべてのプロパティを更新できますか?

ありがとうございます。

答えて

0

私はそれを使って遊んだ後で解決策を見つけました。私は継続を追加していないので、まだ項目を追加していました。

public static void DuplicateItem<T>(T dataBaseItem, T origionalItem) 
    { 
     var type = origionalItem.GetType(); 
     var properties = type.GetProperties(); 
     var databasePropertyInfo = dataBaseItem.GetType(); 
     foreach (var origionalProperty in properties) 
     { 
      var n = origionalProperty.Name; 
      var databaseProperty = databasePropertyInfo.GetProperty(origionalProperty.Name); 
      if(IsComplex(origionalProperty.GetValue(origionalItem,null))) 
       continue; 
      if (IsCollection(origionalProperty.GetValue(origionalItem, null))) 
      { 
       ClearItems(databaseProperty.GetValue(dataBaseItem,null), 
        origionalProperty.GetValue(origionalItem, null)); 
       continue; 
      } 
      var origionalValue = origionalProperty.GetValue(origionalItem, null); 
      var t = Nullable.GetUnderlyingType(origionalProperty.PropertyType) 
       ?? origionalProperty.PropertyType; 
      var saveValue = (origionalValue == null) ? null : Convert.ChangeType(origionalValue, t); 
      databaseProperty.SetValue(dataBaseItem, saveValue); 
     } 
    } 
関連する問題