首页 > 解决方案 > SQL Server (getutcdate()) 在外部 POST 上插入默认值

问题描述

我最近开始深入研究 SQL Server Management Studio 和 Web API 2。我遵循了一个教程,该教程指示我可以获得将数据库行插入表中的当前日期。我使用了这个getutcdate()函数,当我在 SQL Server Management Studio 中创建一个新行时,日期会自动填写,就像它应该的那样。

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

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

任何帮助表示赞赏,谢谢!

这是我的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; }
}

标签: c#sqlsql-serverentity-frameworkasp.net-web-api

解决方案


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

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

修改TestPerson

告诉您的数据库将CreatedDateGETUTCDATE()设置为在为表进行新插入时未提供该列的时间TestPerson。所以使用这个 TSQL:

ALTER TABLE TestPerson 
   ADD CONSTRAINT DF_CreatedDateValue DEFAULT GETUTCDATE() FOR CreatedDate

修改您的 TestPerson 实体类

告诉 Entity Framwework,您的CreatedDate属性将由数据库使用DatabaseGenerated数据注释属性计算(生成),如下所示:

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

或者通过使用流畅的配置,如下所示:

modelBuilder.Entity<TestPerson>().Property(entity => entity .TestCreated) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

测试您的 Web API

就这些!您可以测试您的 Web API。将person实例保存到数据库后,您将看到CreateDate将填充数据库创建的默认值。


推荐阅读