Дублировать объект сущности без его идентификатора

#c# #entity-framework

#c# #entity-framework

Вопрос:

Я должен дублировать объект, но не его идентификатор, а затем обрабатывать новый объект как отдельный объект. Набор средств доступа для моего идентификатора сущностей недоступен. Поэтому я не могу изменить идентификатор и установить для него значение null, и прямо сейчас мне разрешено выполнять только AddOrUpdate (на основе идентификатора) в БД. Я не могу выполнить простое добавление. Мне нужно иметь возможность дублировать или клонировать разные объекты, поэтому, возможно, универсальная функция поможет мне сделать это, но я не знаю, с чего начать. Любая помощь, пожалуйста.?

Комментарии:

1. Нужно ли дублировать какой-либо EntityType вашего контекста? Есть ли у вас общий базовый класс? Можете ли вы изменить ClassCode?

2. Является ли идентификатор первичным ключом? При использовании первичного ключа у вас может быть только одна строка в базе данных для каждого идентификатора. Вы должны использовать обновление, если вы изменяете существующее значение первичного ключа.

Ответ №1:

Одним из вариантов является использование 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.
  

В обоих случаях столбец ID не был скопирован. Возможно, вы захотите использовать пример «test2» для использования context.Entities.Создать, чтобы создать новый прокси-сервер отслеживания для нового объекта, хотя EF отлично работает с новыми экземплярами POCO объекта при условии, что он добавлен в набор баз данных объектов.