У меня есть класс POCO (OPERATION
), который используется в качестве сущности Entity Framework. Этот класс имеет свойство навигации (OP
) и внешний ключ в той же связанной сущности (OP_ID
).
В методе я получаю OPERATION
, а для этого OPERATION
the OP_ID
и OP
оба null
. Когда я устанавливаю OP_ID
в допустимое значение для этого внешнего ключа, свойство навигации OP
остается null
. Когда я явно обнаруживаю изменения в контексте, свойство навигации OP
теперь назначается с правильным значением.
Пример кода
public bool UpdateOperation(operationID)
{
IQueryable<OPERATION> operations = from o in base.ctx.OPERATION
select o;
OPERATION operation = operations
.Where(o => o.OPERATION_ID == operationID)
.Include("OP")
.FirstOrDefault();
if (operation != null)
{
operation.OP_ID = opId;
}
// operation.OP is null here
operation.GetContext().ChangeTracker.DetectChanges();
// operation.OP is populated here
}
Я подтвердил, что operation
на самом деле является динамическим c прокси. Для чего стоит, когда я обнаруживаю изменения, operation.OP
также становится динамическим c прокси. Однако даже в этом случае присвоение другого значения для operation.OP_ID
все еще требует явного вызова DetectChanges()
для обновления значения operation.OP
.
Обновление
В ответ на комментарий @ErikPhilips документация здесь , похоже, подразумевает, что это должно произойти. В частности:
В следующих примерах показано, как использовать свойства внешнего ключа и свойства навигации для связывания связанных объектов. С ассоциациями внешних ключей вы можете использовать любой метод для изменения, создания или изменения отношений. С независимыми ассоциациями нельзя использовать свойство внешнего ключа.
Присвоив новое значение свойству внешнего ключа, как в следующем примере.
course.DepartmentID = newCourse.DepartmentID;
...
Когда вы изменяете отношение объектов, прикрепленных к контексту, с помощью одного из методов, описанных выше, Entity Framework необходимо сохранять внешние ключи, ссылки и коллекции в синхронизации c. Entity Framework автоматически управляет этой синхронизацией (также известной как исправление отношений) для объектов POCO с прокси.
Если вы используете объекты POCO без прокси, вы должны убедиться, что метод DetectChanges вызывается для синхронизации связанные объекты в контексте.
Также может быть полезен некоторый дополнительный контекст. Это устаревшее приложение, которое раньше работало непосредственно с ObjectContext
вместо DbContext
, хотя даже тогда с использованием EF 6. Сейчас мы переходим на DbContext
API. Этот конкретный код, без каких-либо изменений, используется для демонстрации ожидаемого поведения. В частности, когда назначено OP_ID
, я вижу в отладчике, что свойство OP
автоматически заполняется, чтобы указывать на правильный OPERATION
.