private void buildOrModifySchemaObjects(SchemaDiff diff, AutoCreate autoCreateSchemaObjectsMode, IDocumentSchema schema, IDDLRunner runner) { if (autoCreateSchemaObjectsMode == AutoCreate.None) { var className = nameof(StoreOptions); var propName = nameof(StoreOptions.AutoCreateSchemaObjects); string message = $"No document storage exists for type {_mapping.DocumentType.FullName} and cannot be created dynamically unless the {className}.{propName} is greater than \"None\". See http://jasperfx.github.io/marten/documentation/documents/ for more information"; throw new InvalidOperationException(message); } if (diff.AllMissing) { rebuildTableAndUpsertFunction(schema, runner); runDependentScripts(runner); return; } if (autoCreateSchemaObjectsMode == AutoCreate.CreateOnly) { throw new InvalidOperationException( $"The table for document type {_mapping.DocumentType.FullName} is different than the current schema table, but AutoCreateSchemaObjects = '{nameof(AutoCreate.CreateOnly)}'"); } if (diff.CanPatch()) { diff.CreatePatch(runner); } else if (autoCreateSchemaObjectsMode == AutoCreate.All) { // TODO -- better evaluation here against the auto create mode rebuildTableAndUpsertFunction(schema, runner); } else { throw new InvalidOperationException( $"The table for document type {_mapping.DocumentType.FullName} is different than the current schema table, but AutoCreateSchemaObjects = '{autoCreateSchemaObjectsMode}'"); } runDependentScripts(runner); }
public when_doing_a_schema_diff_with_no_changes_95_style() { var store1 = TestingDocumentStore.For(_ => { _.DatabaseSchemaName = Marten.StoreOptions.DefaultDatabaseSchemaName; _.Schema.For<User>().Duplicate(x => x.UserName).Duplicate(x => x.Internal); }); store1.Schema.EnsureStorageExists(typeof(User)); // Don't use TestingDocumentStore because it cleans everything upfront. store2 = DocumentStore.For(_ => { _.Connection(ConnectionSource.ConnectionString); _.DatabaseSchemaName = Marten.StoreOptions.DefaultDatabaseSchemaName; _.Schema.For<User>().Duplicate(x => x.UserName).Duplicate(x => x.Internal); }); mapping = store2.Schema.MappingFor(typeof(User)).As<DocumentMapping>(); diff = mapping.SchemaObjects.As<DocumentSchemaObjects>().CreateSchemaDiff(store2.Schema); }