#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 объекта при условии, что он добавлен в набор баз данных объектов.