LINQ to SQL和附加子对象

时间:2009-06-17 16:05:23

标签: sql linq

我正在编写一个类(希望)允许通过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中有两个Address对象 - 从数据库中拉出的对象,和新的。然后,当我尝试附加第一个Address子对象时,我得到一个异常“无法附加已存在的实体”。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以在附加父实体之前附加子实体吗?这会阻止附加问题吗?

只需使用反射来获取所有EntityRef个对象,并将每个Entity属性附加到相应的表中。