我正在编写一个类(希望)允许通过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子对象时,我得到一个异常“无法附加已存在的实体”。
有什么想法吗?
答案 0 :(得分:2)
您可以在附加父实体之前附加子实体吗?这会阻止附加问题吗?
只需使用反射来获取所有EntityRef
个对象,并将每个Entity
属性附加到相应的表中。