C# SQL Server(getutcdate())在外部POST上插入默认值

C# SQL Server(getutcdate())在外部POST上插入默认值,c#,sql,sql-server,entity-framework,asp.net-web-api,C#,Sql,Sql Server,Entity Framework,Asp.net Web Api,我最近开始潜入SQLServerManagementStudio和WebAPI2。我遵循了一个教程,该教程指示我可以获取将数据库行插入表中的当前日期。我使用了getutcdate()函数,当我在SQLServerManagementStudio中创建新行时,日期会像预期的那样自动填充 但是,当从我的WebAPI项目(使用实体框架)提交帖子时,创建日期值填充为该值0001-01-01 00:00:00.0000000 现在,我假设这是datetime2(7)类型或其他类型的默认值,但我想知道为什么

我最近开始潜入SQLServerManagementStudio和WebAPI2。我遵循了一个教程,该教程指示我可以获取将数据库行插入表中的当前日期。我使用了
getutcdate()
函数,当我在SQLServerManagementStudio中创建新行时,日期会像预期的那样自动填充

但是,当从我的WebAPI项目(使用实体框架)提交帖子时,创建日期值填充为该值0001-01-01 00:00:00.0000000

现在,我假设这是
datetime2(7)
类型或其他类型的默认值,但我想知道为什么它不会自动生成当前日期时间,就像我在SQLServerManagementStudio中添加它一样

感谢您的帮助,谢谢

以下是我的
Post()
方法:

public HttpResponseMessage Post([FromBody] TestPerson person)
{
    try
    {
        using (TestWebAPIEntities entities = new TestWebAPIEntities())
        {
            entities.TestPerson.Add(person);
            entities.SaveChanges();

            var message = Request.CreateResponse(HttpStatusCode.Created, person);
            message.Headers.Location = new Uri(Request.RequestUri + person.id.ToString());

            return message;
        }
    }
    catch (Exception ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
    }
}
下面是生成的
TestPerson
类:

public partial class TestPerson
{
    public int id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
    public string PhoneNumber { get; set; }
    public int NumberOfKids { get; set; }
    public System.DateTime CreateDate { get; set; }
}

正如您在对问题的评论中所说,您使用的是在SSMS中创建的数据库,这意味着您使用的是数据库优先的方法

您需要按照这些步骤来确保
TestPerson
表中所有创建的行都将其
CreateDate
列设置为当前sql server日期时间作为默认值

修改
TestPerson
表 当为
TestPerson
表进行新插入时未提供该列时,请告诉数据库将
CreatedDate
值设置为
GETUTCDATE()
。因此,请使用以下TSQL:

ALTER TABLE TestPerson 
   ADD CONSTRAINT DF_CreatedDateValue DEFAULT GETUTCDATE() FOR CreatedDate
修改TestPerson实体类 告诉实体FramWork您的
CreatedDate
属性将由数据库使用
DatabaseGenerated
数据注释属性计算(生成),如下所示:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreateDate { get; private set; }
modelBuilder.Entity<TestPerson>().Property(entity => entity .TestCreated) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
或者使用如下所示的fluent配置:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreateDate { get; private set; }
modelBuilder.Entity<TestPerson>().Property(entity => entity .TestCreated) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
modelBuilder.Entity().Property(Entity=>Entity.TestCreated)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
测试Web API
就这些!您可以测试您的Web API。将
person
实例保存到数据库后,您将看到
CreateDate
将填充数据库创建的默认值。

您正在从C#(值为0001-01-01的结构)传递值,因此无法使用默认值。我建议截取发送到db的查询。它应该是这样的:
INSERT-INTO-tab(col1,timestamp_col)值(…,'0001-01-01 00:00:00.000'))
您是在实体框架中使用代码优先的方法,还是在使用非EF生成的现有数据库?@CodeNotFound我正在使用我在Management Studio中创建的现有测试数据库。@CAlex您能通过编辑您的问题向我们展示TestPerson实体的外观吗?@CodeNotFound我刚刚更新了帖子使用TestPerson实体。感谢您的全面回复。使用DatabaseGenerated注释是有意义的,而且似乎是我遗漏的部分。然而,即使在添加并重新编译之后,我仍然得到相同的结果。我已经在SSMS中设置了CreateDate列的默认值,但是我删除了它并运行了您提供的查询,以防万一。它仍然返回:0001-01-01T00:00:00。作为旁注,我在SSMS中用于CreateDate的数据类型是datetime2(7)。您确定您自己没有在某个地方初始化ProeProperty吗。找到该项目的所有参考资料,确保你没有设置它。我看到了一些东西。在my PersonDataModel.edmx中,CreateDate已将(无)设置为默认值。这就是我的问题所在吗?我想应该计算一下。