C# SQL Server(getutcdate())在外部POST上插入默认值
我最近开始潜入SQLServerManagementStudio和WebAPI2。我遵循了一个教程,该教程指示我可以获取将数据库行插入表中的当前日期。我使用了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)类型或其他类型的默认值,但我想知道为什么
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已将(无)设置为默认值。这就是我的问题所在吗?我想应该计算一下。