私のデータベースに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>
を使って、コレクション内のすべてのアイテムとコレクション内のすべてのプロパティを更新できますか?
ありがとうございます。