diff --git a/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs b/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs
index 8510093..84eb39e 100644
--- a/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs
+++ b/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs
@@ -28,6 +28,6 @@ public void CreateLinkedSaleBase(IObjectSpace objectSpace, SaleBase createdObjec
}
protected override void OnDeactivated() {
base.OnDeactivated();
- newObjectController.ObjectCreated += CreateLinkedSaleBaseDescendantController_ObjectCreated;
+ newObjectController.ObjectCreated -= CreateLinkedSaleBaseDescendantController_ObjectCreated;
}
-}
\ No newline at end of file
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6ccbac5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+# XAF - How to Unit Test Controllers, Actions, and Business Logic (EF Core)
+
+This example creates unit tests for an Entity Framework Core ORM-powered XAF application. The solution illustrates best practices for testing XAF Controllers, Actions, business object behavior, and security-related usage scenarios via [xUnit](https://www.nuget.org/packages/xunit/) and [Moq](https://www.nuget.org/packages/Moq/).
+
+## Implementation Details
+
+The E2E test project addresses the following testing patterns:
+
+| Test Class | What It Tests |
+|---|---|
+| [`ActionsInViewTests`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/ActionsInViewTests.cs) | The test checks action enable and disable behavior based on `TargetObjectsCriteria` and `SelectionDependencyType` in Detail and List Views. |
+| [`SetTaskActionExecuteTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionExecuteTest.cs) | The test runs a `SingleChoiceAction` and updates properties on selected objects. |
+| [`SetTaskActionStateTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionStateTest.cs) | The test evaluates action state based on security permissions through `ISecurityStrategyBase`. |
+| [`FindBySubjectActionExecuteTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/FindBySubjectActionExecuteTest.cs) | The test runs a `ParametrizedAction` that finds and displays an object by criteria. |
+| [`CreateLinkedSaleBaseDescendantControllerTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CreateLinkedSaleBaseDescendantControllerTest.cs) | The test verifies event subscription and copies properties from parent objects to child objects in nested frames. |
+| [`CaptionHelperTests`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CaptionHelperTests.cs) | The test sets up `CaptionHelper` localization through `ModelApplication` and `ExpressApplicationSetupParameters`. |
+
+### Testing Actions in Views (Mocking Approach)
+
+The tests mock `IObjectSpace`, `XafApplication`, `Frame`, and View objects (`DetailView`/`ListView`) to evaluate action behavior without running the full application. Key mocking patterns include:
+
+- Mocking `IObjectSpace` and its LINQ query methods for object retrieval.
+- Creating `DetailView`/`ListView` instances with mocked `CollectionSource` and `ListEditor`.
+- Setting up `Frame` objects to activate controllers and register actions.
+- Verifying `CommitChanges()` is called after action execution.
+
+### Testing Security-Dependent Logic
+
+`SetTaskActionStateTest` demonstrates how to mock `ISecurityStrategyBase` to simulate granted or denied field-level permissions and verify that action state reflects the current user's access rights.
+
+### Testing Event Subscriptions
+
+`CreateLinkedSaleBaseDescendantControllerTest` uses reflection to verify that a controller correctly subscribes to the `NewObjectViewController.ObjectCreated` event.
+
+## Files to Review
+
+- [ActionsInViewTests.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/ActionsInViewTests.cs)
+- [SetTaskActionExecuteTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionExecuteTest.cs)
+- [SetTaskActionStateTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionStateTest.cs)
+- [FindBySubjectActionExecuteTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/FindBySubjectActionExecuteTest.cs)
+- [CreateLinkedSaleBaseDescendantControllerTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CreateLinkedSaleBaseDescendantControllerTest.cs)
+- [CaptionHelperTests.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CaptionHelperTests.cs)
+
+## Documentation
+
+- [EF Core Unit Tests](https://docs.devexpress.com/eXpressAppFramework/405947/debugging-testing-and-error-handling/ef-core-unit-tests)
+
+## Does this example address your development requirements/scenarios?
+
+[
](https://www.devexpress.com/support/examples/survey.xml?utm_source=github&utm_campaign=XAF_unit-test-ef-core&utm_term=yes) [
](https://www.devexpress.com/support/examples/survey.xml?utm_source=github&utm_campaign=XAF_unit-test-ef-core&utm_term=no)
+
+(you will be redirected to DevExpress.com to submit your response)