IsRequired应用于具有默认值的列

时间:2015-03-23 17:13:18

标签: entity-framework

我有以下SQL表:

create table dbo.Post (
  Id int identity not null,
  Content nvarchar (max) not null,
  Title nvarchar (200) not null,
  Created datetime not null
    constraint DF_Post_Created default getutcdate()
)

所以我为Created设置了一个默认值,并将其设置为not null。

实体框架配置应该如何?类似的东西:

Property(x => x.Created).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

我是否需要添加IsRequired?我不确定IsRequired是否意味着EF应该要求Created的值,或者数据库是否需要Created。

2 个答案:

答案 0 :(得分:1)

如果数据库是由EF生成的,

IsRequired会将列设置为NOT NULL

具有默认值意味着如果在插入记录时未指定值,则将使用默认值。

如果您不想在列中允许空值,则列应为NOT NULL,并且应设置实体属性IsRequired

答案 1 :(得分:0)

好吧,EF对默认值还没有很好的支持。显然,EF 7会得到更好的支持,因为社区已经在requesting这段时间了。

我已经使用EF Power Tools映射了您的表,并且生成的配置类是:

public class PostMap : EntityTypeConfiguration<Post>
{
    public PostMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        this.Property(t => t.Content)
            .IsRequired();

        this.Property(t => t.Title)
            .IsRequired()
            .HasMaxLength(200);

        // Table & Column Mappings
        this.ToTable("Posts");
        this.Property(t => t.Id).HasColumnName("Id");
        this.Property(t => t.Content).HasColumnName("Content");
        this.Property(t => t.Title).HasColumnName("Title");
        this.Property(t => t.Created).HasColumnName("Created");
    }
}

正如您所看到的,Created列未按要求进行映射,如果您未设置该属性,EF将抛出异常,因为该列将尝试使用default(DateTime)进行更新是{1/1/0001 12:00:00 AM},该列的类型为datetime(此post中的详细信息)。即使您将该列的类型更改为datetime2,您也不会会有你期待的行为。

如果您想要一个具有默认值的属性,您可以解决在实体的构造函数中设置属性的问题:

public class Post
{
   public int Id {get;set;}
   [Required]
   public DateTime Created{get;set;}
   public Post()
   {
      Created=DateTime.Now;
   }
}