实体未通过WebApi调用

时间:2017-02-06 18:03:20

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

我正在尝试通过WebApi操作使用Entity Framework插入项目。上下文似乎表明该项已被保存,但当我签入基础数据库时,该项未被保存。

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

以下是行动:

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;
    }

我的背景:

public class MyDbContext : DbContext
{

    public DbSet<HelpRequest> HelpRequests { get; set; }

}

我生成的模型:

public partial class HelpRequest
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Message { get; set; }
    public System.DateTime CreateDate { get; set; }
    public Nullable<bool> Responded { get; set; }
}

我通过PostMan测试这个,我的身体数据设置为raw,json

{"Title":"Title1","Message":"Message1","CreateDate":"2017-02-05T10:03:35.258"}

数据库中的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>

构造

public MyDbContext()
{
    Database.Log = sql => System.Diagnostics.Debug.Write(sql);
}

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

1 个答案:

答案 0 :(得分:0)

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

<强> MyDbContext.cs

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

    public DbSet<HelpRequest> HelpRequests { 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数据库连接字符串,而不是(较旧的)edmx设计人员使用的复杂版本使用。