У меня есть объект, загруженный из одного DBContext с внесенными в него изменениями. Если я затем создаю другой DBContext, как бы я загрузил в него один и тот же объект из базы данных? Это должно быть общим для разных объектов, поэтому я не могу просто искать, где идентификаторы одинаковы - некоторые объекты могут иметь разные ключевые свойства.Open Entity в другом DBContext в Entity Framework
Причина в том, что я хочу использовать сущность, загруженную во второй контекст, для проверки некоторых измененных свойств в первом, сравнивая предыдущие значения с новыми. Таким образом, второй контекст чисто читается только во время проверки первого объекта.
Редактировать
Я пытался сохранить это просто я думаю, что немного больше деталей требуется.
Скажет, у меня есть эта сущность:
public partial class SomeEntity : IValidatableObject
{
public int Id { get; set; }
public int StatusId { get; set; }
//... Other properties
public virtual ICollection<SomeOtherEntity> relatedEntity { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){
// validation code
}
}
То, что я пытаюсь сделать, это когда объект заверил StatusId
сравнивается с StatusId
в настоящее время в базе данных и может произойти ошибка проверки - например, говорят StatusId
не может быть изменен с 1 до 5. Как
Как Pawel упоминалось это может быть сделано с помощью OriginalValues однако я также должен быть в состоянии проверить StatusId
на основе значений в relatedEntity
. Например, StatusId
не может быть изменен с 1 на 2, если в relatedEntity
существуют определенные значения.
Итак, для выполнения этой проверки мне нужен дубликат объекта SomeEntity
в его неизмененной форме из базы данных, чтобы его можно было сравнить с объектом, который я пытаюсь изменить.
Это немного грязный, но идея, которую я придумал это:
Сделать
SomeEntity
членом новой, пустой, интерфейсIMyValidationInterface
.public interface IMyValidationInterface { } public partial class SomeEntity : IValidatableObject, IMyValidationInterface { public int Id { get; set; } // .... }
Override метод
ValidateEntity
наMyDBContext
так, что объект с исходными значениями передается в метод проверки на сущность.public class MyDBContext : DbContext { protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items) { if (entityEntry.Entity is IMyValidationInterface) { var _validationContext = new MyDbContext(); /// TODO: some code here to load a duplicated version of /// the entity from the database var originalEntity; // unchanged entity is here // unmodified entity is passed as an item to the entities // Validate method items.Add("OriginalEntity", originalEntity); } return base.ValidateEntity(entityEntry, items); } } public partial class SomeEntity : IValidatableObject, IMyValidationInterface { // ..... public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){ // validation code if (validationContext.Items.ContainsKey("OriginalEntity")){ var originalEntity = (SomeEntity)validationContext.Items["OriginalEntity"]; // do validation here and yield return any validation errors } } }
бит я застрял на это TODO часть в приведенном выше фрагменте кода.
Я иду на это неправильно?
Вы сохраняете изменения на ваш измененный объект загружен из первого DBC-контекста? –
Возможно, вы можете использовать OriginalValues и не должны иметь несколько контекстов? – Pawel
Думаю, вам просто нужно знать, какие изменения внесены в сущность для проверки. Пожалуйста, проверьте эту ссылку, если это поможет, [LINK]: http://stackoverflow.com/questions/3265257/getting-all-changes-made-to-an-object-in-the-entity-framework – Ganesh