Exemplo n.º 1
0
        public void Create_and_initialize_foreign_key()
        {
            var table = new Table("dbo.MyTable");
            var column0 = new Column("Foo", "int");
            var column1 = new Column("Bar", "int");

            table.AddColumn(column0);
            table.AddColumn(column1);

            var referencedTable = new Table("dbo.MyReferencedTable");
            var referencedColumn0 = new Column("ReferencedFoo", "int");
            var referencedColumn1 = new Column("ReferencedBar", "int");

            referencedTable.AddColumn(referencedColumn0);
            referencedTable.AddColumn(referencedColumn1);

            var foreignKey = new ForeignKey(
                "MyForeignKey",
                new[] { column0, column1 },
                new[] { referencedColumn0, referencedColumn1 },
                cascadeDelete: true);

            Assert.Equal("MyForeignKey", foreignKey.Name);
            Assert.IsAssignableFrom<IReadOnlyList<Column>>(foreignKey.Columns);
            Assert.Equal(2, foreignKey.Columns.Count);
            Assert.Same(column0, foreignKey.Columns[0]);
            Assert.Same(column1, foreignKey.Columns[1]);
            Assert.Same(table, foreignKey.Table);
            Assert.IsAssignableFrom<IReadOnlyList<Column>>(foreignKey.ReferencedColumns);
            Assert.Equal(2, foreignKey.ReferencedColumns.Count);
            Assert.Same(referencedColumn0, foreignKey.ReferencedColumns[0]);
            Assert.Same(referencedColumn1, foreignKey.ReferencedColumns[1]);
            Assert.Same(referencedTable, foreignKey.ReferencedTable);
            Assert.True(foreignKey.CascadeDelete);
        }
Exemplo n.º 2
0
        public void Clone_replicates_instance_and_adds_column_clones_to_cache()
        {
            var column0 = new Column("C0", typeof(int));
            var column1 = new Column("C1", typeof(int));
            var referencedColumn0 = new Column("RC0", typeof(int));
            var referencedColumn1 = new Column("RC1", typeof(int));
            var foreignKey 
                = new ForeignKey(
                    "FK", 
                    new[] { column0, column1 },
                    new[] { referencedColumn0, referencedColumn1 }, 
                    cascadeDelete: true);

            var cloneContext = new CloneContext();
            var clone = foreignKey.Clone(cloneContext);

            Assert.NotSame(foreignKey, clone);
            Assert.Equal("FK", clone.Name);
            Assert.Equal(2, clone.Columns.Count);
            Assert.NotSame(column0, clone.Columns[0]);
            Assert.NotSame(column1, clone.Columns[1]);
            Assert.Equal("C0", clone.Columns[0].Name);
            Assert.Equal("C1", clone.Columns[1].Name);
            Assert.Equal(2, clone.ReferencedColumns.Count);
            Assert.NotSame(referencedColumn0, clone.ReferencedColumns[0]);
            Assert.NotSame(referencedColumn1, clone.ReferencedColumns[1]);
            Assert.Equal("RC0", clone.ReferencedColumns[0].Name);
            Assert.Equal("RC1", clone.ReferencedColumns[1].Name);
            Assert.True(clone.CascadeDelete);

            Assert.Same(clone.Columns[0], cloneContext.GetOrAdd(column0, () => null));
            Assert.Same(clone.Columns[1], cloneContext.GetOrAdd(column1, () => null));
            Assert.Same(clone.ReferencedColumns[0], cloneContext.GetOrAdd(referencedColumn0, () => null));
            Assert.Same(clone.ReferencedColumns[1], cloneContext.GetOrAdd(referencedColumn1, () => null));
        }
Exemplo n.º 3
0
        protected virtual bool MatchForeignKeys(
            [NotNull] ForeignKey sourceForeignKey,
            [NotNull] ForeignKey targetForeignKey,
            [NotNull] IDictionary <Column, Column> columnMap)
        {
            Check.NotNull(sourceForeignKey, "sourceForeignKey");
            Check.NotNull(targetForeignKey, "targetForeignKey");
            Check.NotNull(columnMap, "columnMap");

            return
                (sourceForeignKey.Name == targetForeignKey.Name &&
                 sourceForeignKey.CascadeDelete == targetForeignKey.CascadeDelete &&
                 MatchColumnReferences(sourceForeignKey.Columns, targetForeignKey.Columns, columnMap) &&
                 MatchColumnReferences(sourceForeignKey.ReferencedColumns, targetForeignKey.ReferencedColumns, columnMap));
        }
Exemplo n.º 4
0
        private ForeignKey BuildForeignKey(DatabaseModel database, IForeignKey foreignKey)
        {
            Check.NotNull(foreignKey, "foreignKey");

            var table           = database.GetTable(foreignKey.EntityType.SchemaQualifiedName());
            var referencedTable = database.GetTable(foreignKey.ReferencedEntityType.SchemaQualifiedName());
            var columns         = foreignKey.Properties.Select(
                p => table.GetColumn(p.ColumnName())).ToArray();
            var referenceColumns = foreignKey.ReferencedProperties.Select(
                p => referencedTable.GetColumn(p.ColumnName())).ToArray();
            var cascadeDelete = foreignKey.CascadeDelete();

            var storeForeignKey = new ForeignKey(
                ForeignKeyName(foreignKey), columns, referenceColumns, cascadeDelete);

            table.AddForeignKey(storeForeignKey);

            return(storeForeignKey);
        }
Exemplo n.º 5
0
        public void Visit_with_drop_foreign_key_operation()
        {
            var model      = new DatabaseModel();
            var column0    = new Column("Foo", typeof(int));
            var column1    = new Column("Bar", typeof(int));
            var table0     = new Table("dbo.T0", new[] { column0 });
            var table1     = new Table("dbo.T1", new[] { column1 });
            var foreignKey = new ForeignKey("FK", new[] { column0 }, new[] { column1 }, cascadeDelete: true);
            var operation  = new DropForeignKeyOperation("dbo.T0", "FK");

            model.AddTable(table0);
            model.AddTable(table1);
            table0.AddForeignKey(foreignKey);

            Assert.Equal(1, table0.ForeignKeys.Count);

            operation.Accept(new DatabaseModelModifier(), model);

            Assert.Equal(0, table0.ForeignKeys.Count);
        }
Exemplo n.º 6
0
        private ForeignKey BuildForeignKey(DatabaseModel database, IForeignKey foreignKey)
        {
            Check.NotNull(foreignKey, "foreignKey");

            var table           = database.GetTable(GetSchemaQualifiedName(foreignKey.EntityType));
            var referencedTable = database.GetTable(GetSchemaQualifiedName(foreignKey.ReferencedEntityType));
            var columns         = foreignKey.Properties.Select(
                p => table.GetColumn(GetColumnName(p))).ToArray();
            var referenceColumns = foreignKey.ReferencedProperties.Select(
                p => referencedTable.GetColumn(GetColumnName(p))).ToArray();
            // TODO: Cascading behaviors not supported. Issue #333
            //var cascadeDelete = foreignKey.CascadeDelete();

            var storeForeignKey = new ForeignKey(
                ForeignKeyName(foreignKey), columns, referenceColumns, cascadeDelete: false);

            table.AddForeignKey(storeForeignKey);

            return(storeForeignKey);
        }
Exemplo n.º 7
0
        private ForeignKey BuildForeignKey(DatabaseModel database, IForeignKey foreignKey)
        {
            Check.NotNull(foreignKey, "foreignKey");

            var table = database.GetTable(GetSchemaQualifiedName(foreignKey.EntityType));
            var referencedTable = database.GetTable(GetSchemaQualifiedName(foreignKey.ReferencedEntityType));
            var columns = foreignKey.Properties.Select(
                p => table.GetColumn(p.ColumnName())).ToArray();
            var referenceColumns = foreignKey.ReferencedProperties.Select(
                p => referencedTable.GetColumn(p.ColumnName())).ToArray();
            var cascadeDelete = foreignKey.CascadeDelete();

            var storeForeignKey = new ForeignKey(
                ForeignKeyName(foreignKey), columns, referenceColumns, cascadeDelete);

            table.AddForeignKey(storeForeignKey);

            return storeForeignKey;
        }
Exemplo n.º 8
0
        public virtual void AddForeignKey([NotNull] ForeignKey foreignKey)
        {
            Check.NotNull(foreignKey, "foreignKey");

            _foreignKeys.Add(foreignKey);
        }
Exemplo n.º 9
0
        public void Clone_gets_column_clones_from_cache()
        {
            var column0 = new Column("C0", typeof(int));
            var column1 = new Column("C1", typeof(int));
            var referencedColumn0 = new Column("RC0", typeof(int));
            var referencedColumn1 = new Column("RC1", typeof(int));
            var foreignKey
                = new ForeignKey(
                    "FK",
                    new[] { column0, column1 },
                    new[] { referencedColumn0, referencedColumn1 },
                    cascadeDelete: true);

            var cloneContext = new CloneContext();
            var columnClone0 = column0.Clone(cloneContext);
            var columnClone1 = column1.Clone(cloneContext);
            var referencedColumnClone0 = referencedColumn0.Clone(cloneContext);
            var referencedColumnClone1 = referencedColumn1.Clone(cloneContext);
            var clone = foreignKey.Clone(cloneContext);

            Assert.NotSame(foreignKey, clone);
            Assert.Equal(2, clone.Columns.Count);
            Assert.Same(columnClone0, clone.Columns[0]);
            Assert.Same(columnClone1, clone.Columns[1]);
            Assert.Equal(2, clone.ReferencedColumns.Count);
            Assert.Same(referencedColumnClone0, clone.ReferencedColumns[0]);
            Assert.Same(referencedColumnClone1, clone.ReferencedColumns[1]);
        }
Exemplo n.º 10
0
        public void Clone_replicates_instance_and_uses_cache()
        {
            var column00 = new Column("C00", typeof(int));
            var column01 = new Column("C01", typeof(string));
            var column10 = new Column("C10", typeof(int));
            var column11 = new Column("C11", typeof(string));
            var table0 = new Table("dbo.T0", new[] { column00, column01 });
            var table1 = new Table("dbo.T1", new[] { column10, column11 });
            var primaryKey0 = new PrimaryKey("PK0", new[] { column00 });
            var primaryKey1 = new PrimaryKey("PK1", new[] { column10 });
            var foreignKey0 = new ForeignKey("FK0", new[] { column01 }, new[] { column10 });
            var foreignKey1 = new ForeignKey("FK1", new[] { column11 }, new[] { column00 });
            var index0 = new Index("IX0", new[] { column00 });
            var index1 = new Index("IX1", new[] { column10 });

            table0.PrimaryKey = primaryKey0;
            table1.PrimaryKey = primaryKey1;
            table0.AddForeignKey(foreignKey0);
            table1.AddForeignKey(foreignKey1);
            table0.AddIndex(index0);
            table1.AddIndex(index1);

            var cloneContext = new CloneContext();
            var clone0 = table0.Clone(cloneContext);

            Assert.NotSame(table0, clone0);
            Assert.Equal("dbo.T0", clone0.Name);

            Assert.Equal(2, clone0.Columns.Count);
            Assert.NotSame(column00, clone0.Columns[0]);
            Assert.NotSame(column01, clone0.Columns[1]);
            Assert.Equal("C00", clone0.Columns[0].Name);
            Assert.Equal("C01", clone0.Columns[1].Name);
            Assert.Equal(typeof(int), clone0.Columns[0].ClrType);
            Assert.Equal(typeof(string), clone0.Columns[1].ClrType);

            Assert.NotNull(clone0.PrimaryKey);
            Assert.NotSame(primaryKey0, clone0.PrimaryKey);
            Assert.Equal("PK0", clone0.PrimaryKey.Name);
            Assert.Equal(1, clone0.PrimaryKey.Columns.Count);
            Assert.Same(clone0.Columns[0], clone0.PrimaryKey.Columns[0]);

            Assert.Equal(1, clone0.ForeignKeys.Count);
            Assert.NotSame(foreignKey0, clone0.ForeignKeys[0]);
            Assert.Equal("FK0", clone0.ForeignKeys[0].Name);
            Assert.Equal(1, clone0.ForeignKeys[0].Columns.Count);
            Assert.Equal(1, clone0.ForeignKeys[0].ReferencedColumns.Count);
            Assert.Same(clone0.Columns[1], clone0.ForeignKeys[0].Columns[0]);
            Assert.Same(cloneContext.GetOrAdd(column10, () => null), clone0.ForeignKeys[0].ReferencedColumns[0]);

            Assert.Equal(1, clone0.Indexes.Count);
            Assert.NotSame(index0, clone0.Indexes[0]);
            Assert.Equal("IX0", clone0.Indexes[0].Name);
            Assert.Equal(1, clone0.Indexes[0].Columns.Count);
            Assert.Same(clone0.Columns[0], clone0.Indexes[0].Columns[0]);

            Assert.Equal(3, cloneContext.ItemCount);
            Assert.Same(clone0.Columns[0], cloneContext.GetOrAdd(column00, () => null));
            Assert.Same(clone0.Columns[1], cloneContext.GetOrAdd(column01, () => null));
            Assert.NotNull(cloneContext.GetOrAdd(column10, () => null));

            var clone1 = table1.Clone(cloneContext);

            Assert.NotSame(table1, clone1);
            Assert.Equal("dbo.T1", clone1.Name);

            Assert.Equal(2, clone1.Columns.Count);
            Assert.NotSame(column10, clone1.Columns[0]);
            Assert.NotSame(column11, clone1.Columns[1]);
            Assert.Equal("C10", clone1.Columns[0].Name);
            Assert.Equal("C11", clone1.Columns[1].Name);
            Assert.Equal(typeof(int), clone1.Columns[0].ClrType);
            Assert.Equal(typeof(string), clone1.Columns[1].ClrType);

            Assert.NotNull(clone1.PrimaryKey);
            Assert.NotSame(primaryKey1, clone1.PrimaryKey);
            Assert.Equal("PK1", clone1.PrimaryKey.Name);
            Assert.Equal(1, clone1.PrimaryKey.Columns.Count);
            Assert.Same(clone1.Columns[0], clone1.PrimaryKey.Columns[0]);

            Assert.Equal(1, clone1.ForeignKeys.Count);
            Assert.NotSame(foreignKey1, clone1.ForeignKeys[0]);
            Assert.Equal("FK1", clone1.ForeignKeys[0].Name);
            Assert.Equal(1, clone1.ForeignKeys[0].Columns.Count);
            Assert.Equal(1, clone1.ForeignKeys[0].ReferencedColumns.Count);
            Assert.Same(clone1.Columns[1], clone1.ForeignKeys[0].Columns[0]);
            Assert.Same(clone0.Columns[0], clone1.ForeignKeys[0].ReferencedColumns[0]);
            Assert.Same(clone1.Columns[0], clone0.ForeignKeys[0].ReferencedColumns[0]);

            Assert.Equal(1, clone1.Indexes.Count);
            Assert.NotSame(index1, clone1.Indexes[0]);
            Assert.Equal("IX1", clone1.Indexes[0].Name);
            Assert.Equal(1, clone1.Indexes[0].Columns.Count);
            Assert.Same(clone1.Columns[0], clone1.Indexes[0].Columns[0]);

            Assert.Equal(4, cloneContext.ItemCount);
            Assert.Same(clone0.Columns[0], cloneContext.GetOrAdd(column00, () => null));
            Assert.Same(clone0.Columns[1], cloneContext.GetOrAdd(column01, () => null));
            Assert.Same(clone1.Columns[0], cloneContext.GetOrAdd(column10, () => null));
            Assert.Same(clone1.Columns[1], cloneContext.GetOrAdd(column11, () => null));
        }
Exemplo n.º 11
0
        public void GetForeignKey_finds_foreign_key_by_name()
        {
            var column00 = new Column("C00", "int");
            var column01 = new Column("C01", "int");
            var table0 = new Table("dbo.T0", new[] { column00, column01 });
            var column10 = new Column("C10", "int");
            var column11 = new Column("C11", "int");
            var table1 = new Table("dbo.T0", new[] { column10, column11 });
            var foreignKey0 = new ForeignKey("FK0", new[] { column00 }, new[] { column10 });
            var foreignKey1 = new ForeignKey("FK1", new[] { column01 }, new[] { column11 });

            table0.AddForeignKey(foreignKey0);
            table0.AddForeignKey(foreignKey1);

            Assert.Same(foreignKey0, table0.GetForeignKey("FK0"));
            Assert.Same(foreignKey1, table0.GetForeignKey("FK1"));
        }
Exemplo n.º 12
0
        public void RemoveForeignKey_removes_specified_foreign_key()
        {
            var column00 = new Column("C00", "int");
            var column01 = new Column("C01", "int");
            var table0 = new Table("dbo.T0", new[] { column00, column01 });
            var column10 = new Column("C10", "int");
            var column11 = new Column("C11", "int");
            var table1 = new Table("dbo.T0", new[] { column10, column11 });
            var foreignKey0 = new ForeignKey("FK0", new[] { column00 }, new[] { column10 });
            var foreignKey1 = new ForeignKey("FK1", new[] { column01 }, new[] { column11 });

            table0.AddForeignKey(foreignKey0);
            table0.AddForeignKey(foreignKey1);

            Assert.Equal(2, table0.ForeignKeys.Count);

            table0.RemoveForeignKey("FK1");

            Assert.Equal(1, table0.ForeignKeys.Count);
            Assert.Same(foreignKey0, table0.ForeignKeys[0]);
        }
Exemplo n.º 13
0
        public void ForeignKeys_gets_read_only_list_of_foreign_keys()
        {
            var column00 = new Column("C00", "int");
            var column01 = new Column("C01", "int");
            var table0 = new Table("dbo.T0", new[] { column00, column01 });
            var column10 = new Column("C10", "int");
            var column11 = new Column("C11", "int");
            var table1 = new Table("dbo.T0", new[] { column10, column11 });
            var foreignKey0 = new ForeignKey("FK0", new[] { column00 }, new[] { column10 });
            var foreignKey1 = new ForeignKey("FK1", new[] { column01 }, new[] { column11 });

            table0.AddForeignKey(foreignKey0);
            table0.AddForeignKey(foreignKey1);

            Assert.IsAssignableFrom<IReadOnlyList<ForeignKey>>(table0.ForeignKeys);
            Assert.Equal(2, table0.ForeignKeys.Count);
            Assert.Same(foreignKey0, table0.ForeignKeys[0]);
            Assert.Same(foreignKey1, table0.ForeignKeys[1]);
        }