违反了多重约束。角色&#39; <t>&#39;关系的多样性为1或0..1

时间:2016-06-19 22:12:39

标签: c# generics entity-framework-6

我在我的数据库中有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,这使我的项目数量增加了一倍,这使得我通过这个术语。我想要的是将所有孩子从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>更新集合中的所有项目以及集合中的所有属性?

谢谢。

1 个答案:

答案 0 :(得分: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);
        }
    }