46 votes

Comment définir la valeur par défaut pour les POCO dans EF CF?

Dans Entity Framework 4, Code uniquement (CTP3), comment définir une valeur par défaut pour une propriété dans la classe EntityConfiguration du 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 ?
    }
}
 

24voto

Chris Pacey Points 534

Avec la version Entity Framework 4.3, vous pouvez le faire par le biais de migrations.

Procédures pas à pas EF 4.3 Code First Migrations

Donc, en utilisant votre exemple, ce serait quelque chose comme:

 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
    }
}
 

15voto

Gavin Coates Points 737

Vous pouvez définir les valeurs par défaut via le constructeur de la classe. Voici un cours de mon projet actuel utilisant MVC3 et 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; }
}
}
 

7voto

321X Points 1216

Je sais que ce sujet est en cours depuis un moment et je suis entré dans une sorte de la même question. Jusqu'à présent, je ne pouvais pas trouver de solution pour que tout soit réuni au même endroit, de sorte que le code soit toujours lisible.

Lors de la création d'un utilisateur, je souhaite que certains champs soient définis par l'objet lui-même via private setters , par exemple, un GUID et une date de création et non de "polluer" le constructeur.

Ma classe d'utilisateurs:

 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; }
}
 

Code d'appel:

 context.Users.Add(User.Create(c=>
{
    c.Name = "Name";
    c.Email = "some@one.com";
    c.Salt = salt;
    c.Password = "mypass";
    c.Roles = new List<Role> { adminRole, userRole };
}));
 

4voto

Yury Tarabanko Points 7414

3voto

user3591722 Points 1

Dans le cas où vous souhaitez que SQL Server fournisse une date par défaut, l'important est defaultValueSql: "GETDATE ()", qui définira la valeur par défaut du serveur SQL, et non seulement l'évaluation du moment de l'exécution du script. (ie 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
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X