-
Notifications
You must be signed in to change notification settings - Fork 460
Small persistence improvements #687
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Summary of ChangesHello @sven-n, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces key improvements to the application's persistence layer, enhancing both flexibility and stability. It enables dynamic updates for plugin configurations, allowing for changes to be applied without service interruption. Additionally, it fortifies the Entity Framework Core context initialization process, ensuring that model-related properties are always accessed safely and reliably, thereby preventing potential errors in data access operations. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces improvements to persistence logic. In PlugInConfiguration, IAssignable is implemented to allow live configuration changes. However, there are a couple of issues in the implementation: the AssignValuesOf(object ...) method has a too-specific type check, and the Id property is incorrectly being assigned, which could lead to primary key violations. In TypedContext, a change was made to ensure the EF Core model is initialized before use, which is a good improvement. However, this exposes a critical underlying issue where TypedContext customizes the model based on an instance property without implementing IModelCacheKeyFactory, which will cause model caching problems in Entity Framework Core. I've provided detailed comments on these points.
src/Persistence/EntityFramework/Model/PlugInConfiguration.Custom.cs
Outdated
Show resolved
Hide resolved
src/Persistence/EntityFramework/Model/PlugInConfiguration.Custom.cs
Outdated
Show resolved
Hide resolved
|
/gemini review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces two valuable improvements. First, it implements IAssignable for PlugInConfiguration, enabling live configuration changes, which enhances flexibility. Second, it improves the robustness of TypedContext by ensuring the EF Core context model is initialized before access, preventing potential race conditions and errors. The changes are well-implemented. I have one suggestion to further improve the robustness of the IAssignable implementation.
| public virtual void AssignValuesOf(object other, MUnique.OpenMU.DataModel.Configuration.GameConfiguration gameConfiguration) | ||
| { | ||
| if (other is MUnique.OpenMU.PlugIns.PlugInConfiguration typedOther) | ||
| { | ||
| this.AssignValuesOf(typedOther, gameConfiguration); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The current implementation of AssignValuesOf(object other, ...) silently ignores objects that are not of type MUnique.OpenMU.PlugIns.PlugInConfiguration. This could hide bugs if an object of an unexpected type is passed. It would be more robust to throw an exception for unsupported types, which makes debugging easier and the contract of the method clearer. The suggested change preserves the behavior of doing nothing if other is null.
public virtual void AssignValuesOf(object other, MUnique.OpenMU.DataModel.Configuration.GameConfiguration gameConfiguration)
{
if (other is MUnique.OpenMU.PlugIns.PlugInConfiguration typedOther)
{
this.AssignValuesOf(typedOther, gameConfiguration);
}
else if (other is not null)
{
throw new ArgumentException($"Cannot assign from an object of type {other.GetType().FullName}.", nameof(other));
}
}
IAssignablefor thePlugInConfigurationto allow live configuration changes while the server is runningTypedContextis properly initialized before accessing some public properties.