Supported databases: Sql Server, Sql Azure, My Sql, Sqlite, Oracle, PostgreSql.
Capable of using the same poco objects for any database vendor.
Small, Fast, Simple to use and understand.
This ORM strives to provide as much detailed information available in any exceptions that are thrown, and we encourage any feedback to improve developer support. In some cases we augment information to database vendor errors. labels are required in some method calls to aid in troubleshooting, for example Label="Query Managers", so if the sql throws an error, that lable will be in the exception to help the developer track down the problem call.
Fully disconnected, poco's can move across application boundaries from client to service layer and perform all crud actions. Perfect for 3-tier development. This ORM does not track changes to objects or cache anything inside a context object.
Supports transactions, and helps developers perform multiple database actions with-in a transaction.
No inheritance requirements, either use attributes or implement an interface to define the mapping of the object to the sql results.
No configuration files, no designers.
Parallel Load support, run multiple queries in parallel and returns the results when done, and the result sets are ordered as sent. Also supports execution of mixed Serial and Parallel working sets for complex database operations.
Allows developers to write sql for reading data, the ORM just maps the results to the object. The ORM does provide simple loads based on id for single objects. All queries use a wrapper to force usage of parameterized sql and actively checks for injection issues. Inserts, Updates and Deletes do not require any sql, this a dynamically built using the attributes. Updates support concurrency checks using a timestamp column and related poco property.
Added LoadAbstractItems methods, same as parallel versions but serial.
Rework of the create instance code.
Adding support for dynamic creation of IDatabaseTypesFactory with-out adding a reference to the Data provider library.
Not sure why I never added support for it as I have been doing this in the Symbiotic Helper for years.
Added ability to override the date used when setting row version property during creates and updates. Was using DateTime.Now, there is now a new method on the IDatabaseTypesFactory called ObtainCurrentDateTime() to provide the date and time.
It now defaults to DateTime.UtcNow but if you set IDatabaseTypesFactory.ObtainCurrentDateTimeDefaultsToUTC = false it will use DateTime.Now.
This is a change to be aware of, I feel the best default is to use DateTime.UtcNow.
Improving the DatabaseActionProcessor, also working on improving the unit tests.
The DatabaseActionProcessor simplifies performing mixed database operations. For example performing reads with writes under a shared transactions or mixing parallel and serial sets of operations while simplifying troubleshooting problems during development.
Fixed a couple missing usages of timeout in ObjectLoader.ObtainHierarchy.
More improvements to DatabaseActionProcessor. Added item isolation for errors created when processing actions. Added example unit test to demonstrate the process of isolating a specific action.
Working on simplifying unit tests. Will make separate unit test classes and corresponding classes and scripts to demonstrate the various types of functionality.
Example: SimpleCrudTests.cs, SimpleCrudTests.sql
Working on breaking up the unti test into smaller classes.
This will simplify the documentation of features and make it easier for a new developer to get started using Symbiotic.
For cases where the relation table method is used for relationships, if the child property is not a collection, the orm no longer loads all the children if multiple exist. The behavior now is to load the first child from the database.
Fixed a bug when a developer overrides the relation column names in the DatabaseRelationTable attribute. It was not honoring the override of parent column name.
Added unit tests to test relation column name overrides.
Replaced some regular collections with thread Concurrent related types.
Added DateTimeOffset to the types unit tests, to ensure DateTimeOffset is supported.
Discovered that some thrown errors while performing loads were throwing DatabaseWriteException. I created a new class to handle command processing and it now throws DatabaseWriteException for writes and DatabaseReadException for reads.
Discovered that when an object attempts to use encryption with-out implementing IObjectChangedSupport, the orm does not provide proper feedback. Now if the object does not implement , it will throw a InvalidEncryptionObjectException exception.
Finished breaking up the unit test into smaller classes.
Change implementations of IDatabaseTypesFactory.PropertyTypeToDatabaseType to throw UnmappedDotNetToDatabaseTypeException when a mapping is not found, was throwing an ArgumentException.
Modified RelationSqlBuilder to use parameters for the parent and child ids.
Changed DeprecatedItem.DeprecationId to an integer type.
Fixed a bug where items were manually created instead of using the IDatabaseTypesFactory.CreateSqlAppender
Reworked unit tests for Postgresql and guid ids.
Started on Nuget package. RC 2.1 built and deployed.
Refactored the the DatabaseTypesFactory into an abstract class, reducing the code needed in the vendor specific implementations.
This also also me maintain better control the shared code, the methods are still overridable to allow developers to fully control creations as needed.
Still working out the best Nuget packaging methods.
Added a new Unit test project called "UniversalTestProject".
This unit test project is intended to support all database vendors using the same code,
with a simple change to a variable, the unit tests can be executed. THe hope is this will simplify support for database vendors.
Modified ISqlQuery and implementation SqlQuerySimple to support adding row limits. Has a new method AddRowLimit(). It's not perfect but works for basic queries.
When using an Oracle database, if there is no sequence specified in the DatabaseColumn attribute, it will default to TableName_sn. This simplifies the poco objects.
Created two new unit test projects. UniversalTestProject_CS and UniversalTestProject_VB.
These tests now run on all supported database vendors unchanged, poco objects are the same for all vendors.
You can change the DatabaseType enum in the UnitTestInitializer class and then run the test for that vendor.
Sqlite can not be ran in parallel as it's a one user database, but all test but one "ProcessActionsMixed" works, and it's not expected as it's doing parallel writes.
Updated Nuget package.
Removed build output folders to reduce size of Nuget package.
Updated Nuget package info. Library is unchanged.
- System.Data.Common (>= 4.3.0)