mvc4 sql查询运行和存储数据(Database First Approach)

时间:2016-09-04 20:35:09

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

我正在使用VS2012中的MVC4 ASP.NET创建一个非常非常基本的库存应用程序。 我的 Item_master 表中有一个字段 Auto_id ,它不是主键,但有助于生成主键。主键旨在在ItemController类中生成。

我想在数据库中执行如下的sql命令并返回下一个Auto_id编号。 Auto_id是一个简单的Integer字段。

select max(Auto_id)+1 as aid from Item_master where Auto_id is not null

我的Create()动作方法如下..

 [HttpPost]
    public ActionResult Create(Item_master item_master)
    {
        int xid = 0;
        String x = "";
        if (ModelState.IsValid)
        {
            x = db.Item_master.SqlQuery("select max(Auto_id)+1 as aid from Item_master where Auto_id is not null").ToList().ToString();

            if (x != null)
                xid = int.Parse(x);
            else
                xid = 0;

            db.Item_master.Add(item_master);
            item_master.Auto_id = xid;
            item_master.Item_id = item_master.Item_type_id.ToString() + xid;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.Item_type_id = new SelectList(db.Type_master, "Type_id", "Type", item_master.Item_type_id);
        return View(item_master);
    }

我生成并稍后编辑的Model类是:

namespace DataEntry.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
public partial class Item_master
{
    public Item_master()
    {
        this.Transactions = new HashSet<Transaction>();
    }
    [ScaffoldColumn(false)]
    public int Auto_id { get; set; }

    [ScaffoldColumn(false)]
    public string Item_id { get; set; }
    public string Item_name { get; set; }
    public Nullable<int> Price { get; set; }
    public Nullable<int> Item_type_id { get; set; }
    public string Desc { get; set; }

    public virtual Type_master Type_master { get; set; }
    public virtual ICollection<Transaction> Transactions { get; set; }
}
}

我目前还没有在Item_master表中输入任何数据。 当我尝试使用自动脚手架视图输入数据时,我得到以下异常:

The The data reader is incompatible with the specified 'Model.Item_master'. A member of the type, 'Auto_id', does not have a corresponding column in the data reader with the same name.

它的内容如下:

  

数据阅读器与指定的&#39; Model.Item_master&#39;不兼容。该类型的成员&#39; Auto_id&#39;在数据阅读器中没有相应的列具有相同的名称。

我知道如何使用try{}catch(){}处理异常,但这个错误出在哪里?我该怎么办?

有没有其他方法可以做我想要的事情?

我正在学习asp.net mvc new。我从来没有在这样的mvc应用程序中使用数据库,但在oracle中有数据库工作经验,我主要是一个php开发人员。

1 个答案:

答案 0 :(得分:0)

您当前的代码会尝试将查询结果映射到Item_master实体对象的集合。但是您的查询没有返回此实体的所有列。

由于您从查询中返回标量整数值,因此您可以考虑使用通用SqlQuery方法。无需调用ToList()方法,然后调用.ToString()结果。您只需调用FirstOrDefault()方法。

var maxId = 0;
var x = db.Database.SqlQuery<int?>("select max(Auto_id)+1 as Auto_id
                                               from Item_master where Auto_id is not null")
                                 .FirstOrDefault();
if (x != null)
{
    maxId= x.Value;
}
// Use maxId as needed.

虽然这可能会解决您的问题,但我强烈建议您查看SQL服务器提供的Identity功能,它会为您自动增量。这可能比手动生成并使用它更安全。用你目前的方法。 2条记录可能具有相同的Auto_id值。