我有以下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。
答案 0 :(得分:1)
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;
}
}