tutorial net mvc how framework foreign first espaƱol create code asp c# asp.net-mvc entity-framework ef-code-first

c# - net - mvc 5 entity framework relationships



Valor predeterminado para los campos obligatorios en las migraciones de Entity Framework (6)

Además de la respuesta de @webdeveloper y @Pushpendra, debe agregar manualmente las actualizaciones a su migración para actualizar las filas existentes. Por ejemplo:

public override void Up() { Sql("UPDATE [dbo].[Movies] SET Title = ''No Title'' WHERE Title IS NULL"); AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false,defaultValue:"MyTitle")); }

Esto es porque AlterColumn produce DDL para establecer el valor predeterminado de la columna a algún valor específico en la especificación de la tabla. El DDL no afecta las filas existentes en la base de datos.

En realidad, estás haciendo dos cambios al mismo tiempo (estableciendo el valor predeterminado y haciendo que la columna NO sea NULA) y cada uno de ellos es válido individualmente, pero dado que estás haciendo los dos al mismo tiempo, puedes esperar que el sistema '' de forma inteligente, realice su intento y configure todos los valores NULL con el valor predeterminado, pero esto no es lo que se espera todo el tiempo.

Supongamos que solo establece el valor predeterminado para la columna y no lo convierte en NOT NULL. Obviamente, no esperas que todos los registros NULL se actualicen con el valor predeterminado que proporciones.

Por lo tanto, en mi opinión, esto no es un error, y no quiero que EF actualice mis datos de la forma en que explícitamente no lo digo. El desarrollador es responsable de instruir al sistema sobre qué hacer con los datos.

[Required] la anotación de datos [Required] a uno de mis modelos en una aplicación ASP.NET MVC . Después de crear una migración, ejecutar el comando Update-Database da como resultado el siguiente error:

No se puede insertar el valor NULL en la columna ''Director'', tabla ''MOVIES_cf7bad808fa94f89afa2e5dae1161e78.dbo.Movies''; la columna no permite nulos. ACTUALIZACIÓN falla. La instrucción se ha terminado.

Esto se debe a que algunos registros tienen NULL en sus columnas de Director . ¿Cómo puedo cambiar automáticamente esos valores a algún director predeterminado (por ejemplo, "John Doe")?

Aquí está mi modelo:

public class Movie { public int ID { get; set; } [Required] public string Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } [Required] public string Genre { get; set; } [Range(1,100)] [DataType(DataType.Currency)] public decimal Price { get; set; } [StringLength(5)] public string Rating { get; set; } [Required] /// <--- NEW public string Director { get; set; } }

y aquí está mi última migración:

public partial class AddDataAnnotationsMig : DbMigration { public override void Up() { AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false)); AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false)); AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5)); AlterColumn("dbo.Movies", "Director", c => c.String(nullable: false)); } public override void Down() { AlterColumn("dbo.Movies", "Director", c => c.String()); AlterColumn("dbo.Movies", "Rating", c => c.String()); AlterColumn("dbo.Movies", "Genre", c => c.String()); AlterColumn("dbo.Movies", "Title", c => c.String()); } }


Descubrí que solo usar el Inicializador de propiedades automáticas en la propiedad de la entidad es suficiente para realizar el trabajo.

Por ejemplo:

public class Thing { public bool IsBigThing { get; set; } = false; }


Por alguna razón, que no pude explicarme por mí mismo, la respuesta aprobada ya no funciona para mí.

Funcionó en otra aplicación, en la que estoy trabajando no funciona.

Entonces, una solución alternativa, pero bastante ineficiente , sería anular el método SaveChanges () como se muestra a continuación. Este método debe estar en la clase Contexto.

public override int SaveChanges() { foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("ColumnName") != null)) { if (entry.State == EntityState.Added) { entry.Property("ColumnName").CurrentValue = "DefaultValue"; } }


Si mal no recuerdo, algo así debería funcionar:

AlterColumn("dbo.Movies", "Director", c => c.String(nullable: false, defaultValueSql: "John Doe"));


no estoy seguro de si esta opción siempre estuvo presente, pero me encontré con un problema similar, descubrí que podía establecer el valor predeterminado sin ejecutar ninguna actualización manual con el siguiente

defaultValueSql: "''NY''"

Recibí un error cuando el valor proporcionado era "NY" entonces me di cuenta de que estaban esperando un valor SQL como "GETDATE()" así que probé "''NY''" y eso fue lo que hizo.

toda la línea se ve así

AddColumn("TABLE_NAME", "State", c => c.String(maxLength: 2, nullable: false, defaultValueSql: "''NY''"));

Gracias a esta respuesta , me puso en el camino correcto


public partial class AddDataAnnotationsMig : DbMigration { public override void Up() { AlterColumn("dbo.Movies", "Title", c => c.String(nullable: false,defaultValue:"MyTitle")); AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false,defaultValue:"Genre")); AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5)); AlterColumn("dbo.Movies", "Director", c => c.String(nullable: false,defaultValue:"Director")); } public override void Down() { AlterColumn("dbo.Movies", "Director", c => c.String()); AlterColumn("dbo.Movies", "Rating", c => c.String()); AlterColumn("dbo.Movies", "Genre", c => c.String()); AlterColumn("dbo.Movies", "Title", c => c.String()); } }