Самым простым решением во многих случаях будет сериализация / десериализация объекта для его простого клонирования. Какой метод сериализации / клонирования вы используете, решать только вам. Этот вопрос содержит несколько предложений на этот счет.
Мне нравится использовать Newtonsoft JSON.NET для сериализации, потому что он очень прост в использовании, имеет минимальные требования (например, не требуются атрибуты компилятора), и я уже использую его для других вещей в моих проектах. В зависимости от вашего варианта использования (например, отсоединение сущности LINQ / SQL для использования в модели пользовательского интерфейса) вы можете стереть идентификаторы базы данных. Простой способ сделать это - передать пользовательский класс DefaultContractResolver в JSON.NET, который исключит свойства идентификатора:
return JsonConvert.SerializeObject(oModel, new JsonSerializerSettings() { ContractResolver = new DNSConfigurationModel.DNSConfigSerializer() });
/// <summary>
/// Helper class to ensure that we do not serialize the domainAdvancedDNS child objects
/// (we will create our own child collections for serialization). We also suppress serialization of the key ID's.
/// </summary>
public class DNSConfigSerializer : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
return (from p in properties
where p.PropertyName != "DomainAdvancedDNS" &&
p.PropertyName != "domainAdvancedDNSSRVs" &&
!(p.DeclaringType.Name == "DomainAdvancedDN" && p.PropertyName == "domainAdvancedDNSConfigID") &&
p.PropertyName != "DomainAdvancedDNSID" &&
p.PropertyName != "domainAdvancedDNSSRVID"
select p).ToList();
}
}