C# 实体未通过WebApi调用保存到数据库

C# 实体未通过WebApi调用保存到数据库,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我试图通过WebApi操作使用实体框架插入一个项。上下文似乎显示该项已保存,但当我签入基础数据库时,该项未保存 PostHelpRequest中的HelpRequest参数已正确解析(它与我在邮递员正文数据中包含的内容相匹配) 行动如下: public class HelpRequestController : ApiController { public HttpResponseMessage PostHelpRequest(HelpRequest item) {

我试图通过WebApi操作使用实体框架插入一个项。上下文似乎显示该项已保存,但当我签入基础数据库时,该项未保存

PostHelpRequest中的HelpRequest参数已正确解析(它与我在邮递员正文数据中包含的内容相匹配)

行动如下:

public class HelpRequestController : ApiController
{

    public HttpResponseMessage PostHelpRequest(HelpRequest item)
    {
        var context = new MyDbContext();
        try
        {
            using (var newcontext = new MyDbContext())
            {
                newcontext.HelpRequests.Add(item);
                newcontext.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

        var response = Request.CreateResponse<HelpRequest>(HttpStatusCode.Created, item);
        string uri = Url.Link("DefaultApi", new { id = 0 });
        response.Headers.Location = new Uri(uri);
        return response;
    }
数据库中的Id列被设置为primary和identity

编辑:

我发现了问题,但不知道如何解决

当我逐步浏览代码并查看newcontext.Database.ConnectionString时,它引用的是一个SQLExpress数据库——它似乎为项目创建了一个数据库

但是,当我打开模型并查看连接字符串时,它引用的是正确的服务器和数据库

为什么上下文被分配了错误的连接字符串

编辑:连接字符串和上下文构造函数

<connectionStrings>
    <add name="connname1" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=servername;initial catalog=mydatabase1;user id=andrewb;password=hahayeahright;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

最终编辑:解决方案是,我需要在我的上下文中用我想要使用的连接字符串的名称设置构造函数。查看Igor的答案。

检查您的
web.config
部分
connectionStrings
。理想情况下,为连接字符串创建一个唯一的名称,并在
DbContext
的构造函数中使用该名称。更简单的方法是在默认构造函数中将该名称传递给
DbContext
的参数化构造函数

MyDbContext.cs

public class MyDbContext : DbContext
{
    public MyDbContext() : base("Name=bcard_portal")

    public DbSet<HelpRequest> HelpRequests { get; set; }
}
公共类MyDbContext:DbContext
{
public MyDbContext():base(“Name=bcard\u门户”)
公共数据库集帮助请求{get;set;}
}
web.config

<connectionStrings>
  <add name="bcard_portal" connectionString="data source=servername;initial catalog=mydatabase1;user id=andrewb;password=hahayeahright;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>



旁注:如果您使用EF6并首先使用
DbContext
进行编码,则在
web.config
中使用标准的ADO.NET db连接字符串,而不是(较旧的)edmx设计器使用的复杂版本。

请检查
web.config
部分
ConnectionString
。理想情况下,为连接字符串创建一个唯一的名称,并在
DbContext
的构造函数中使用该名称。更简单的方法是在默认构造函数中将该名称传递给
DbContext
的参数化构造函数

MyDbContext.cs

public class MyDbContext : DbContext
{
    public MyDbContext() : base("Name=bcard_portal")

    public DbSet<HelpRequest> HelpRequests { get; set; }
}
公共类MyDbContext:DbContext
{
public MyDbContext():base(“Name=bcard\u门户”)
公共数据库集帮助请求{get;set;}
}
web.config

<connectionStrings>
  <add name="bcard_portal" connectionString="data source=servername;initial catalog=mydatabase1;user id=andrewb;password=hahayeahright;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>



旁注:如果您使用EF6并首先使用
DbContext
进行编码,则在
web.config
中使用标准的ADO.NET db连接字符串,而不是(较旧的)edmx设计器使用的复杂版本。

是否启用了SQL语句日志记录?INSERT语句在日志中是什么样子的?旁注:Change
抛出新异常(例如Message)
抛出
或删除整个
捕捉
块<代码>抛出
将保留原始异常的堆栈跟踪,您现有的语句将其重置,这不利于尝试找出引发异常的原因。我同意,这只是让它首先工作,但是我可以确认没有抛出异常。
但是当我签入基础数据库时,该项没有保存。
非常好。您是否在运行代码的同时运行了
Sql Profiler
,以便查看针对数据库和服务器响应执行insert语句的代码?您是否启用了Sql语句日志记录?INSERT语句在日志中是什么样子的?旁注:Change
抛出新异常(例如Message)
抛出
或删除整个
捕捉
块<代码>抛出
将保留原始异常的堆栈跟踪,您现有的语句将其重置,这不利于尝试找出引发异常的原因。我同意,这只是让它首先工作,但是我可以确认没有抛出异常。
但是当我签入基础数据库时,该项没有保存。
非常好。您是否在运行代码的同时运行了
Sql Profiler
,以便查看针对数据库和服务器响应执行insert语句的代码?
public class MyDbContext : DbContext
{
    public MyDbContext() : base("Name=bcard_portal")

    public DbSet<HelpRequest> HelpRequests { get; set; }
}
<connectionStrings>
  <add name="bcard_portal" connectionString="data source=servername;initial catalog=mydatabase1;user id=andrewb;password=hahayeahright;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>