У меня есть ассоциация (виртуальная, lazyloaded one-to-one-or-null), и я хочу установить ее в null. Я обнаружил, что это невозможно. , если вы не используете, и затем установите для него значение null.Использование Entity Framework (Code First) для обновления/изменения объекта с нулевым соединением с нулем.
someEntity.AnotherEntity.ToString(); // Needs to be done in order to force a load since im using a service that wraps a generic repository
someEntity.AnotherEntity = null; // Now this works because i loaded above.
я Google вокруг много, и кажется, что хотят заряжания someEntity вариант, или добавить новое свойство к SomeEntity
, который:
[ForeignKey("AnotherEntity")] // With this annotation
int? AnotherEntity_Id // Added this property
И затем работать с обнуляемого AnotherEntityId вместо ассоциации собственность AnotherEntity.
Я сейчас использую второй подход, и он немного раздувает Entity, но кажется более твердым, потому что вам также не нужны дополнительные вызовы SQL.
Почему я не могу установить ассоциации в null и EF это понял?
Что касается второго подхода, который я использую. Это хорошая практика или что-то лучше?
Спасибо @danludwig - вы объяснили это очень хорошо, и это также имеет смысл сейчас. К сожалению, этот ответ не может быть найден ни в одной документации (что я знаю). – imbageek
Это неинтуитивно, и по этому поводу есть другие вопросы.Но если вы думаете об этом, вы не хотите, чтобы ваш установщик свойств попадал в db каждый раз, когда он вызывается, если свойство равно null. Это то, что он должен был бы сделать, чтобы работать, когда собственность еще не была лениво загружена. – danludwig
Согласовано. Вот почему я выбираю подход № 2 и тот факт, что вы можете написать * someEntity.AnotherEntity * Теперь я рассматриваю как удобную только для чтения ассоциацию, когда истинная работа должна выполняться над свойствами Id. Это также облегчает автоматическое сопоставление класса с другим классом, когда свойства имеют одно и то же имя. – imbageek