我在ASP.net中使用Web API,允许HTTP Posts更新映射的SQL数据库。
我希望每次插入新行时,Id都会自动递增1。表定义如下:
CREATE TABLE [dbo].[PoolTests] (
[Id] INT IDENTITY (1, 1),
[SiteID] NVARCHAR (128) NOT NULL,
[Date] NVARCHAR (MAX) NULL,
[Tub] NVARCHAR (MAX) NULL,
[par1] FLOAT (53) NOT NULL,
[par2] FLOAT (53) NOT NULL,
[par3] FLOAT (53) NOT NULL,
[par4] FLOAT (53) NOT NULL
);
我已将表格映射到一个类:
public class PoolTest
{
public int Id { get; set; }
public string SiteID { get; set; }
public string Date { get; set; }
public string Tub { get; set; }
public double par1 { get; set; }
public double par2 { get; set; }
public double par3 { get; set; }
public double par4 { get; set; }
}
我是通过HTTP Post Request
:
// POST: api/PoolTests
[ResponseType(typeof(PoolTest))]
public IHttpActionResult PostPoolTest([FromBody]PoolTest poolTest)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.PoolTests.Add(poolTest);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = poolTest.Id }, poolTest);
}
问题是我发送的请求是否包含Id
,即:
{"Id": 1, "SiteID": "sample string 2", "Date": "sample string 3", "Tub": "sample string 5", "par1": 5.1, "par2": 6.1, "par3": 7.1, "par4": 8}
然后我得到了这个例外:
“自创建数据库以来,支持'WebApplicationMVCContext'上下文的模型已更改。请考虑使用Code First Migrations更新数据库
在第db.PoolTests.Add(poolTest);
行
或者如果我省略发送Id
:
{ "SiteID": "sample string 2", "Date": "sample string 3", "Tub": "sample string 5", "par1": 5.1, "par2": 6.1, "par3": 7.1, "par4": 8}
因为它是一个自动递增字段,所以我不接受VS异常,但fiddler报告
400 HTTP localhost:53660 / api / PoolTests 149 no-cache;过期:-1 application / json; charset = utf-8 fiddler:6644
所以我不确定问题是否来自我使用自动递增行Id配置表的方式,即模型类到HTTP请求数据库的映射?
答案 0 :(得分:2)
该异常意味着您的模型类与数据库表完全不匹配。
如果您处于数据库优先方案(您设计数据库然后创建类),那么您应该添加一个" ADO.NET实体数据模型"到您的项目并选择Code First from Database选项。
这将根据您的数据库结构自动为您的项目生成所有类。
为此,请查看本指南,逐步说明如何制作: https://msdn.microsoft.com/en-us/library/jj200620.aspx