framework first column code .net entity-framework ef-code-first entity-framework-4

.net - column - entity framework code first default value string



¿Cómo establecer el valor predeterminado para POCO en EF CF? (7)

Con el lanzamiento de Entity Framework 4.3 puede hacerlo a través de Migrations.

EF 4.3 Code First Migrations Tutorial

Entonces, usar tu ejemplo sería algo así como:

public partial class AddPersonClass : DbMigration { public override void Up() { CreateTable( "People", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(maxLength: 100), CreatedOn = c.DateTime(nullable: false, defaultValue: DateTime.UtcNow) }) .PrimaryKey(t => t.Id); } public overide void Down() { // Commands for when Migration is brought down } }

En el Primer enfoque del Entity Framework Code First, ¿cómo establece un valor predeterminado para una propiedad en la clase EntityConfiguration de POCO?

public class Person { public int Id { get; set; } public string Name { get; set; } public DateTime CreatedOn { get; set; } } public class PersonConfiguration : EntityConfiguration<Person> { public PersonConfiguration() { Property(p => p.Id).IsIdentity(); Property(p => p.Name).HasMaxLength(100); //set default value for CreatedOn ? } }



En el caso en que desee que SQL Server proporcione una fecha predeterminada de la manera en que lo haría, la parte importante es defaultValueSql: "GETDATE ()" que establecerá el servidor sql por defecto, no solo evaluará la hora en que se ejecutó el script (es decir, DateTime.UtcNow)

public partial class AddPersonClass : DbMigration { public override void Up() { CreateTable( "People", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(maxLength: 100), CreatedOn = c.DateTime(nullable: false, defaultValueSql: "GETDATE()") }) .PrimaryKey(t => t.Id); } public overide void Down() { // Commands for when Migration is brought down } }


No estoy seguro de qué versión de EF esté disponible, pero a partir de la versión 5 seguramente puede manejar esto. Simplemente configure un valor predeterminado de GetDate () en la columna en SQL, ya sea en TSQL o en el diseñador, luego configure sus clases EF de la siguiente manera:

public class Person { public int Id { get; set; } public string Name { get; set; } public DateTime CreatedOn { get; set; } } public class PersonConfiguration : EntityConfiguration<Person> { public PersonConfiguration() { Property(p => p.Id).IsIdentity(); Property(p => p.Name).HasMaxLength(100); this.Property(p => p.CreatedOn ).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed); } }

Tenga en cuenta que no necesita convertir la columna de la base de datos nulable ni en la propiedad POCO.


No hay otra manera más que usar DB MIGRATIONS y para habilitar las migraciones debes establecer tu propiedad como esta

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreatedOn { get; set; }

Y después de eso, una vez que se crea su base de datos, debe seguir los siguientes pasos para habilitar las migraciones. Vaya a la consola del Administrador de programas y ejecute los siguientes comandos comando uno por uno

  • PM> Enable-Migrations
  • PM> Add-Migration AlterMyTable Aquí AlterMyTable puede ser cualquier nombre. esto creará un archivo en la carpeta Migraciones recién agregada en su solución currentTimestamp_AlterMyTable.cs -Ahora copie lo siguiente al método Up de currentTimestamp_AlterMyTable.cs
  • AlterColumn("Person", "CreatedOn", n => n.DateTime(nullable: false, defaultValueSql: "SYSUTCDATETIME()")); Y luego de eso ejecuta el último comando en tu Consola del Administrador de Programas
  • PM> Update-Database Y ahora si ve la tabla Person en su base de datos y luego navega hasta la columna CreatedOn debería tener el valor predeterminado como SYSUTCDATETIME() es decir, ahora si intenta insertar algunos datos en esta tabla, su base de datos automáticamente actualice esta columna CreatedOn para usted.

Puede establecer los valores predeterminados a través del constructor para la clase. Aquí hay una clase que tengo en mi proyecto actual, usando MVC3 y Entity Framework 4.1:

namespace MyProj.Models { using System; using System.Collections.Generic; public partial class Task { public Task() { this.HoursEstimated = 0; this.HoursUsed = 0; this.Status = "To Start"; } public int ID { get; set; } public string Description { get; set; } public int AssignedUserID { get; set; } public int JobID { get; set; } public Nullable<decimal> HoursEstimated { get; set; } public Nullable<decimal> HoursUsed { get; set; } public Nullable<System.DateTime> DateStart { get; set; } public Nullable<System.DateTime> DateDue { get; set; } public string Status { get; set; } public virtual Job Job { get; set; } public virtual User AssignedUser { get; set; } } }


Sé que este tema está pasando por un tiempo y caí en algún tipo de problema. Hasta el momento no pude encontrar una solución para mí que lo mantenga todo junto en un solo lugar, por lo que el código aún es legible.

En la creación de un usuario, quiero tener algunos campos establecidos por el objeto en sí a través de private setters , por ejemplo, un GUID y una Fecha de creación, y no "contaminar" el constructor.

Mi clase de usuario:

public class User { public static User Create(Action<User> init) { var user = new User(); user.Guid = Guid.NewGuid(); user.Since = DateTime.Now; init(user); return user; } public int UserID { get; set; } public virtual ICollection<Role> Roles { get; set; } public virtual ICollection<Widget> Widgets { get; set; } [StringLength(50), Required] public string Name { get; set; } [EmailAddress, Required] public string Email { get; set; } [StringLength(255), Required] public string Password { get; set; } [StringLength(16), Required] public string Salt { get; set; } public DateTime Since { get; private set; } public Guid Guid { get; private set; } }

Código de llamada:

context.Users.Add(User.Create(c=> { c.Name = "Name"; c.Email = "[email protected]"; c.Salt = salt; c.Password = "mypass"; c.Roles = new List<Role> { adminRole, userRole }; }));