En la anterior entrega hemos visto como usar el nuevo paquete que a salido del equipo de Data Development en Redmon. En esta nueva entrada, intentaremos continuar con algunos detalles importantes que nos permitan comprender mejor con que estamos tratando.
Migraciones automáticas
Si recuerda, cada vez que ejecutamos una migración por medio del comando Add-Command se incorpora a nuestro proyecto el sacaffolding de la migración por medio de una clase de tipo DbMigration. En alguna ocasión, puede que no nos interese tener estos ficheros de scaffolding y simplemente ejecutar la migración. A este proceso, se le conoce como migración automática. Para mostrar esto partiremos del código de la anterior entrada y modificaremos nuestra clase Customer agregandole una nueva propiedad.
1 2 3 4 5 6 7 8 |
<span class="kwrd">public</span> <span class="kwrd">class</span> Customer { <span class="kwrd">public</span> <span class="kwrd">int</span> Id { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> FirstName { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> LastName { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> Email { get; set; } <span class="kwrd">public</span> <span class="kwrd">int</span> Age { get; set; } } |
Bien, ahora para actualizar nuestro esquema, solamente tenemos que ejecutar el comando Update-Database, sin necesidad de crear la migración. Para que esto funcione necesitamos establecer en la configuración de las migraciones, nuestra clase Settings, que habilite las migraciones automáticas, tal y como podemos ver en el siguiente fragmento.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="kwrd">public</span> <span class="kwrd">class</span> Settings : DbMigrationContext<CRMUnitOfWork> { <span class="kwrd">public</span> Settings() { AutomaticMigrationsEnabled = <span class="kwrd">true</span>; SetCodeGenerator<CSharpMigrationCodeGenerator>(); AddSqlGenerator<SqlConnection, SqlServerMigrationSqlGenerator>(); <span class="rem">// Uncomment the following line if you are using SQL Server Compact </span> <span class="rem">// SQL Server Compact is available as the SqlServerCompact NuGet package</span> <span class="rem">// AddSqlGenerator<System.Data.SqlServerCe.SqlCeConnection, SqlCeMigrationSqlGenerator>();</span> } } |
Si bien la actualización automática del esquema es util, puede llegar a ser necesario disponer del script de actualización en vez de la ejecución de la migración directamente. Para disponer de este script, solamente tenemos que agregar el flag Script al comando anterior. La siguientes lines T-SQL se corresponden a una nueva migración en la que se ha incluido una propiedad Address.
1 2 3 4 5 6 7 |
BEGIN TRANSACTION; SET XACT_ABORT ON; ALTER TABLE [Customers] ADD [Address] [nvarchar](max); INSERT INTO [__MigrationHistory] (Migration, CreatedOn, Hash, Model) VALUES (<span class="str">'Automatic Migration'</span>, getdate(), 0x4EE620C904605E84D8F981B7A5B861D15FFB6BC5DB8F9B9945E924EB798B72A4, 0x1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22FEC7BFF71F7CFC7BBC5B94E9655E3745B5FCECA3DDF1CE4769BE9C56B36279F1D947EBF67CFBE0A3DFE3E8374E1E9FCE16EFD29F34EDF6D08EDE5C369F7D346FDBD5A3BB779BE93C5F64CD78514CEBAAA9CEDBF1B45ADCCD66D5DDBD9D9D83BBBB3B777302F111C14AD3C7AFD6CBB658E4FC07FD79522DA7F9AA5D67E517D52C2F1BFD9CBE79CD50D317D9226F56D934FFECA3A74FBE282EEAAC253C9A8FD2E3B2C80887D77979FE9E08ED3C04421FD9AEA8B35342AABD7E73BDCAB9C3CF3E3A59376DB5C86BBF15B5FBBDF2EBE003FAE8655DADF2BABD7E959FEBBB67B38FD2BBE17B77BB2FDAD7BC77D03DFDB66CEFED7D94BE5897653629E983F3AC6CF28FD2D5A78F5EB7559D7F9E2F7322423E7B99B56D5E2FF16ECEE82B191EAD3EBD1D251EDEDDD90325EE66CB65D5325D7B8877D07C56D44D8B5F0DB6AFDB9AF8E5A3F459F12E9F3DCF9717EDDC62FC45F6CE7C42BF7E947EB52C88BDE8A5B65EE7FE08E5EFCD3D3FCF7E8E3A3E5D6445F943EFF5F8C28E7488216E00309BD579D3FC2C23FEF8AE939C8DF2444AE48BBCCD66599BFD48A4023459EF7D3B6BE63FA753457AB8CD0A2283D17FAFBE20D8ED97E7DFADEAB79D1993375EE76D475712B3B92E44338FAD1EED52A10BC46390181C9F7FA2C3B2037016E4AE9810636AEE0ED89AC75F64AB1551DCB33DFA49FA5A0CCFC9F6EBF737310B817177DA442C8DC5D6F6447C985DE49D6FA96BC29495EE531AF924030F9CCC16FD66B7992ED35777D6BAE2E7886FDEC0EFF2966F83DDE47620380A3EA3412D4894787C3A3AC264C8BEEACBAFA75999D511713EA9CAF56239A41236BDED192E1F88F7F1ED613953E483729FDE1E92DA161F8C7E747B186C297C08FCC17BBC6F0C4500C37CD887F3F86E676EBBECE3E9196DD951DC5D86BC15BB06FAE16B73ECA01962303731EDC6B77F76F8D6B30E3E10EFE31FF20CF5F46DB789EDDDEADD8E7E7DACBA2E50C23CFEAEC3DF537ED2E4A394887459CCA0F85E5F376DBE18A3C1F8F52F2A4FCA82C6EB1A7C912D8BF3BC69DF546F73042FA49BBF7EE4608D7BD3CCCAFFB7860F05867FA357F39ECE64CFED5F5E66F5749ED55B8BECDD9DF7F56DBBAEFC07010BDCF30F82E4B9DC4CC4F7A451C7E17E0F54FEBFE144FFAC3096A7C7BE61B2F51CDA9E23356076BA12BCC9A7157DF4D947B349450310443D6FF8F62EEF4D1E6FACA36FC225EEABE2C777FD0CCDE3A779535C3810C8D72CF3298CA9036ADA9C2DCF2B33BF344A1F23D3A43BFD8AFF71DD16E7D9B4A5AFA724431CFEFC6456AE59BE27F9EC6CF9E5BA5DADDBE3A6C91793F2DA1FEFE3BB9BFB67BF3FC4F9F1972B7607BE8921109A050D21FF72F9645D94338BF7B33EFB0F81006BAA4C115614FE11B88B6B0BE945B5BC252025DFD37C952F21916FF2C5AA2460CD97CBD7D9653E8CDBCD340C29F6F86991914FB5F029289F2826AF33EAD9EB823AF0DF70FDD19FC4AE941E3CFA7F020000FFFFDE9A70EE93140000); DELETE FROM [EdmMetadata]; INSERT INTO [EdmMetadata] ([ModelHash]) VALUES (<span class="str">'7A1D3FB94B39A8198EF177EDE6FF734EE97083E664B613C98EA9F74BA468B42F'</span>); COMMIT TRANSACTION; |
Con esto hemos acabado esta primera mini-serie sobre las migraciones. Esperemos que se siga trabajando en completar nuevas features y seguir escuchando todo el feedback que la comunidad está aportando.
Saludos
Unai
Las dos últimas entradas de este blog trataban sobre una de las novedades ( una de las importantes )
Hoy mismo se ha hecho pública la primera beta del paquete de “migraciones” que el equipo de Entity Framework