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

时间:2018-06-15 14:51:10

标签: c# sql sql-server entity-framework asp.net-web-api

我最近开始深入研究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中添加它一样管理工作室。

感谢任何帮助,谢谢!

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

1 个答案:

答案 0 :(得分:0)

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

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

修改TestPerson

如果在为CreatedDate表进行新插入时未提供该列,请告知您的数据库将GETUTCDATE()值设置为TestPerson。所以使用这个TSQL:

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

修改TestPerson实体类

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

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

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

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

测试Web API

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