2016-06-19 6 views
0

Ich habe 1 zu viele Beziehung mit in meiner Datenbank Ich versuche, alle th Objekte in der Sammlung mit einer generischen Methode zu aktualisieren.Multiplikationsbedingung verletzt. Die Rolle '<T>' der Beziehung hat Multiplizität 1 oder 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); 
     } 
    } 

Diese Methode funktioniert gut, außer auf Sammlungen. es wird einfach nur die Artikel von originalItem.Collection zu databaseItem.Colletion hinzufügen, was dazu führt, dass ich doppelt so viele Artikel habe, wie ich sollte, was mich durch diese Ausnahme macht. Was ich will, ist nur alle Kinder von databaseItem.Collection bis origanalItem.Collection zu aktualisieren. So

Ich habe versucht, eine Änderung vorzunehmen:

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); 
     } 
    } 

und Clear:

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); 
      } 

     } 
    } 

Das jetzt gibt mir nur 3 Stück, aber ich bin zu werfen immer noch die Ausnahme. So jetzt meine Frage: Wie kann ich ClearItems<TDatabase,TOriganial> verwenden, um alle Elemente in der Sammlung und alle Eigenschaften in der Sammlung zu aktualisieren?

Vielen Dank.

Antwort

0

Ich fand die Lösung nach einem Tag des Spielens mit ihm ich habe keine Fortsetzung hinzugefügt, so dass es immer noch die Elemente hinzugefügt wurde.

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); 
     } 
    } 
Verwandte Themen