如何在EF CF中设置POCO的默认值?

时间:2010-06-29 03:51:03

标签: .net entity-framework ef-code-first entity-framework-4

在Entity Framework Code First方法中,如何在POCO的EntityConfiguration类中为属性设置默认值?

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

7 个答案:

答案 0 :(得分:24)

随着Entity Framework 4.3的发布,您可以通过迁移实现此目的。

EF 4.3 Code First Migrations Walkthrough

所以使用你的例子就像是:

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

答案 1 :(得分:15)

您可以通过类的构造函数设置默认值。这是我在当前项目中使用MVC3和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; }
}
}

答案 2 :(得分:7)

我知道这个话题已经持续了一段时间,我走进了某种相同的问题。到目前为止,我无法找到一个解决方案,将整个事物放在一个地方,因此代码仍然可读。

在创建用户时,我希望通过private setters由对象本身设置一些字段,例如GUID和创建日期,而不是“污染”构造函数。

我的用户类:

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

致电代码:

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

答案 3 :(得分:4)

答案 4 :(得分:3)

我不确定哪个版本的EF可用,但从版本5开始,你肯定可以处理这个问题。只需在SQL中的列上设置默认值GetDate(),无论是在TSQL中还是在设计器中,然后按如下方式设置EF类:

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

请注意,您不需要使数据库列可为空,也不需要使POCO属性。

答案 5 :(得分:3)

如果您希望SQL Server提供默认日期,那么重要的部分是defaultValueSql:&#34; GETDATE()&#34;这将设置sql server的默认值,而不仅仅是评估脚本运行的时间(即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
    }
}

答案 6 :(得分:0)

除了使用数据库迁移之外别无他法,要启用迁移,您必须像这样设置属性

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

之后,一旦创建了数据库,您必须按照以下步骤启用迁移。 转到程序管理器控制台并逐个执行以下命令

  • PM> Enable-Migrations
  • PM> Add-Migration AlterMyTable此处 AlterMyTable 可以是任何名称。 这将在解决方案currentTimestamp_AlterMyTable.cs中新添加的Migrations文件夹下创建一个文件 - 现在将以下内容复制到 currentTimestamp_AlterMyTable.cs
  • 的Up方法
  • AlterColumn("Person", "CreatedOn", n => n.DateTime(nullable: false, defaultValueSql: "SYSUTCDATETIME()"));之后执行程序管理器控制台中的最后一个命令
  • PM> Update-Database 现在,如果您在数据库中看到Person表,然后导航到CreatedOn列,则默认值应为SYSUTCDATETIME(),即现在如果您尝试向此插入一些数据表格您的数据库将自动为您更新此列CreatedOn