Здесь есть несколько опций, я перечислю 3 из них:
Опция 1: Использование GraphDiff
* Для этого Configuration.AutoDetectChangesEnabled
вашего контекста должно быть установлено в значение true.
Просто установите GraphDiff с NuGet
Install-Package RefactorThis.GraphDiff
Затем
using (var context = new Context())
{
var customer = new Customer()
{
Id = 12503,
Name = "Jhon Doe",
City = new City() { Id = 8, Name = "abc" }
};
context.UpdateGraph(customer, map => map.AssociatedEntity(p => p.City));
context.Configuration.AutoDetectChangesEnabled = true;
context.SaveChanges();
}
Для получения более подробной информации о GraphDiff смотрите здесь .
Вариант 2. Поиск и редактирование
Поиск вашей сущности с помощью EF для отслеживания ее в контексте.Затем отредактируйте свойства.
* Для этого Configuration.AutoDetectChangesEnabled
вашего контекста должно быть установлено значение true.
var customer = new Customer()
{
Id = 12503,
Name = "Jhon Doe",
City = new City() { Id = 8, Name = "abc" }
};
using (var context = new Contexto())
{
var customerFromDatabase = context.Customers
.Include(x => x.City)
.FirstOrDefault(x => x.Id == customer.Id);
var cityFromDataBase = context.Cities.FirstOrDefault(x => x.Id == customer.City.Id);
customerFromDatabase.Name = customer.Name;
customerFromDatabase.City = cityFromDataBase;
context.Configuration.AutoDetectChangesEnabled = true;
context.SaveChanges();
}
Опция 3: использование скалярного свойства
ВС точки зрения производительности это лучший способ, но он мешает вашему классу заботиться о базе данных.Поскольку вам потребуется создать скалярное свойство ( примитив тип) для сопоставления идентификатора.
* Таким образом, нет необходимости устанавливать Configuration.AutoDetectChangesEnabled
в значение true.А также вам не нужно будет делать запрос к базе данных для извлечения сущностей (как и первые два варианта - да, GraphDiff делает это за кулисами!).
var customer = new Customer()
{
Id = 12503,
Name = "Jhon Doe",
City_Id = 8,
City = null
};
using (var contexto = new Contexto())
{
contexto.Entry(customer).State = EntityState.Modified;
contexto.SaveChanges();
}