【问题标题】:Why won't ActionResult persist record to Database?为什么 ActionResult 不会将记录持久化到数据库?
【发布时间】:2016-07-01 17:34:50
【问题描述】:

所以,我有一个相当简单的模型和一个相当简单的控制器。我的视图成功地将TabularData 记录传递给Controller。它通过添加到上下文的动作,然后出现在SaveChanges。它没有错误或任何东西。然而,当我检查数据库时,表中不存在该记录。我无法为我的生活找出原因。如果我尝试再次插入相同的记录,它会给我一个密钥违规错误。我确定我的模型连接到正确的数据库,因为如果我在 SQL 中插入一条记录,它会在我在 VS 的服务器资源管理器中查询表时显示出来。这似乎是一个如此简单的操作,但我正在挠头试图弄清楚我做错了什么......

这是我的模型:

namespace ReflectionProject.Models
{
    public class TabularData
    {
        [Key]
        public string User { get; set; }
        public string Choice1 { get; set; }
        public string Choice2 { get; set; }
        public string Choice3 { get; set; }
        public string Choice4 { get; set; }
        public string Choice5 { get; set; }
    }

    public class SandboxDBContext : DbContext
    {
        public DbSet<TabularData> TabularDatas { get; set; }
    }
}

这是控制器:

namespace ReflectionProject.Controllers
{

    public class HomeController : Controller
    {
        private SandboxDBContext db = new SandboxDBContext();
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public string Index(TabularData td)
        {
            db.TabularDatas.Add(td);
            db.SaveChanges();
            return "Thanks!";
        }
    }
}

记录的另一个注意事项:如果我尝试通过网络应用再次插入记录,则会引发密钥冲突。然而,如果我在 SQL Server 中手动插入记录,它不会抱怨。再一次,我确定模型指向了正确的数据库。

【问题讨论】:

  • 尝试将此添加到您的关键字段中,而不仅仅是 [Key] [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

标签: .net asp.net-mvc entity-framework


【解决方案1】:

您正在使用User 作为您的主键。这将为表添加一个唯一约束。根据您当前的设计,每个用户只能拥有一条记录。

【讨论】:

  • 是的,没关系。这是一个沙盒测试解决方案,所以我对此很满意。但是,我仍然无法弄清楚为什么记录不会保存。
  • 嗯,一定是因为如果我去服务器资源管理器,我可以看到我的数据库、我的表,并且它会查询实时数据。如果我通过 SSMS 插入一条记录,我可以回到 VS,说“显示表数据”,这就是我的数据。除非模型和数据之间存在歪斜的东西?但是,DbContext 不应该自动处理所有这些吗?
  • 修正字符串是什么?是DataSource=(localdb)偶然吗?
  • &lt;add name="SandboxEntities" connectionString="metadata=res://*/Models.Sandbox.csdl|res://*/Models.Sandbox.ssdl|res://*/Models.Sandbox.msl;provider=System.Data.SqlClient;provider connection string=&amp;quot;data source=localhost;initial catalog=Sandbox;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&amp;quot;" providerName="System.Data.EntityClient" /&gt;
  • 没有人“必须”更新到 Windows 10。它目前对 Windows 7 和 8 用户免费,强烈推荐,但如果您愿意,您仍然可以使用 Windows 3.1。
【解决方案2】:

我刚刚删除了我的项目并重新开始。这一次,它在模型中创建了 DbContext 和 Data 类。不知道为什么它以前没有这样做,但是......唉,这是我的解决方案。 Microsoft 无法跟上我的出色表现,所以我只是对其进行了核对并重新开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多