Search code examples
c#databasedatabase-migrationmigratordotnet

Migratordotnet creating initial migration


I'm trying to use migratordotnet for existing database. My database has around 100 tables and I'm trying to generate initial migration.

I've tried using

C:\migrations>Migrator.Console.exe SqlServer "Data Source=.\sqlexpress;Initial Catalog=my_database;Integrated Security = True;" MigracijeBaze.dll -dump InitialMigration.cs

Unfortinutely, generated migration has every column with typeof(string). Int, DateTime, Decimal columns are converted to string. For example, for table Godine

CREATE TABLE [dbo].[Godine](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FirmaID] [nvarchar](2) NOT NULL,
    [Godina] [int] NOT NULL,
    [BazaSifri] [nvarchar](50) NOT NULL,
    [BazaPodataka] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Godine] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

is generated migration

Database.AddTable("Godine",
    new Column("ID", typeof(String)),
    new Column("FirmaID", typeof(String)),
    new Column("Godina", typeof(String)),
    new Column("BazaSifri", typeof(String)),
    new Column("BazaPodataka", typeof(String)),
);

Am I doing something wrong? What are the best practices for doing initial migrations?


Solution

  • I have found the answer. I've downloaded source code and used debugger. It seems that dump option is not completely implemented.

    public virtual Column[] GetColumns(string table)
    {
        List<Column> columns = new List<Column>();
        using (
            IDataReader reader =
                ExecuteQuery(
                    String.Format("select COLUMN_NAME, IS_NULLABLE from information_schema.columns where table_name = '{0}'", table)))
        {
            while (reader.Read())
            {
                Column column = new Column(reader.GetString(0), DbType.String);
                string nullableStr = reader.GetString(1);
                bool isNullable = nullableStr == "YES";
                column.ColumnProperty |= isNullable ? ColumnProperty.Null : ColumnProperty.NotNull;
    
                columns.Add(column);
            }
        }
    
        return columns.ToArray();
    }
    

    Database type is hard coded. I'll just call sql script for my first migration. Related Issue is on the issue tracker