.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 ?
}
}
Desafortunadamente no puedes. http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/a091ccd6-0ba8-4d4f-8f5e-aafabeb258e4
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óncurrentTimestamp_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 tablaPerson
en su base de datos y luego navega hasta la columnaCreatedOn
debería tener el valor predeterminado comoSYSUTCDATETIME()
es decir, ahora si intenta insertar algunos datos en esta tabla, su base de datos automáticamente actualice esta columnaCreatedOn
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 };
}));