我正在使用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表中输入任何数据。 当我尝试使用自动脚手架视图输入数据时,我得到以下异常:
它的内容如下:
数据阅读器与指定的&#39; Model.Item_master&#39;不兼容。该类型的成员&#39; Auto_id&#39;在数据阅读器中没有相应的列具有相同的名称。
我知道如何使用try{}catch(){}
处理异常,但这个错误出在哪里?我该怎么办?
有没有其他方法可以做我想要的事情?
我正在学习asp.net mvc new。我从来没有在这样的mvc应用程序中使用数据库,但在oracle中有数据库工作经验,我主要是一个php开发人员。
答案 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
值。