linq-to-sql – 将Linq克隆到Sql实体 – 分离数据上下文

前端之家收集整理的这篇文章主要介绍了linq-to-sql – 将Linq克隆到Sql实体 – 分离数据上下文前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要克隆 Linq to sql实体.概述:
  1. Customer origCustomer = db.Customers.SingleOrDefault(c => c.CustomerId == 5);
  2. Customer newCustomer = CloneUtils.Clone(origCustomer);
  3. newCustomer.CustomerId = 0; // Clear key
  4. db.Customers.InsertOnSubmit(newCustomer);
  5. db.SubmitChanges(); // throws an error

其中CloneUtils.Clone()是一种简单的泛型方法,它使用反射将数据从原始实体复制到新实体.

我遇到的问题是,当我尝试将新实体添加数据库时,我收到以下错误

已尝试附加或添加非新的实体,可能已从另一个DataContext加载.这不受支持.

我似乎无法找到一种从数据上下文中分离克隆实体的简单/通用方法.或者我可以调整克隆方法以“跳过”与上下文相关的字段?

谁能指出我正确的方向?

谢谢.

为了完整起见,这是我最终遵循Marcus的建议的方法

  1. public static T ShallowClone<T>(T srcObject) where T : class,new()
  2. {
  3. // Get the object type
  4. Type objectType = typeof(T);
  5.  
  6. // Get the public properties of the object
  7. PropertyInfo[] propInfo = srcObject.GetType()
  8. .GetProperties(
  9. System.Reflection.BindingFlags.Instance |
  10. System.Reflection.BindingFlags.Public
  11. );
  12.  
  13. // Create a new object
  14. T newObject = new T();
  15.  
  16. // Loop through all the properties and copy the information
  17. // from the source object to the new instance
  18. foreach (PropertyInfo p in propInfo)
  19. {
  20. Type t = p.PropertyType;
  21. if ((t.IsValueType || t == typeof(string)) && (p.CanRead) && (p.CanWrite))
  22. {
  23. p.SetValue(newObject,p.GetValue(srcObject,null),null);
  24. }
  25. }
  26.  
  27. // Return the cloned object.
  28. return newObject;
  29. }

解决方法

仅克隆公共属性
  1. var PropertyBindings = BindingFlags.Public | BindingFlags.Instance;

这是值类型或字符串

  1. var PropType = p.PropertyType.IsValueType || p.PropertyType == typeof(string);

这是可以访问的

  1. var IsAccessible = p.CanRead && p.CanWrite;

猜你在找的MsSQL相关文章