Один из вариантов - использовать Automapper для выполнения мелкого клонирования. Automapper можно настроить так, чтобы он игнорировал определенные свойства, такие как идентификатор, или все свойства с недоступными установщиками:
Итак, с учетом сущности, подобной:
public class SomeObject
{
public int SomeId { get; private set; }
public string Name { get; set; }
public SomeObject(int? id = null)
{
if (id.HasValue)
SomeId = id.Value;
}
}
вы можете настроить маппер так:
var mapperConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<SomeObject, SomeObject>().IgnoreAllPropertiesWithAnInaccessibleSetter();
});
IMapper mapper = new Mapper(mapperConfig);
var test = new SomeObject(1) { Name = "Fred" }; // object we will clone.
var test2 = new SomeObject(); // example of an existing "new" object to copy values into...
mapper.Map(test, test2); // Copy values from first into 2nd..
var test3 = mapper.Map<SomeObject>(test); // Example of letting automapper create a new clone.
В обоих случаях столбец идентификатора не был скопирован. Возможно, вы захотите использовать пример «test2» для использования context.Entities.Create для создания нового прокси-сервера отслеживания для новой сущности, хотя EF отлично работает с новыми экземплярами POCO сущности, если она добавлена в DbSet сущностей.