System.Data.SqlClient.SqlException: 无法将值 NULL 插入列 'IngredientId'、table 'RecipeApplicationDb.dbo.IngredientModels';
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'IngredientId', table 'RecipeApplicationDb.dbo.IngredientModels';
我一直在寻找一种方法来为 ASP.NET MVC 应用程序自动生成 ID。这是因为我在尝试更新数据库时遇到此错误:
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'IngredientId', table 'RecipeApplicationDb.dbo.IngredientModels';
这是模特:
public class IngredientModel
{
[Key]
public int IngredientId { get; set; }
[Required]
public string Name { get; set; }
}
这是控制器:
public class IngredientController : Controller
{
private RecipeApplicationDb db = new RecipeApplicationDb();
public ActionResult Index()
{
//var ingredients = db.Ingredients.Include(i => i.DefaultUOM);
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "IngredientId,Name,SeasonStartdate,SeasonEnddate")] IngredientModel ingredientModel)
{
if (ModelState.IsValid)
{
db.Ingredients.Add(ingredientModel);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.IngredientId = new SelectList(db.UnitOfMeasures, "UnitOfMeasureId", "Name", ingredientModel.IngredientId);
return View(ingredientModel);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
我认为解决这个问题的最好方法是使用 Linq 表达式来生成 IngredientId。
为此,我发现(除其他外)这个post:How do I use Linq to obtain a unique list of properties from a list of objects?
有人可以告诉我这是否是正确的解决方案,如果是这样,我应该把这段代码放在哪里。
提前致谢。
=============编辑=====================
我还创建了一个包含以下内容的配置文件:
#region Ingredienten
var italiaanseHam = new IngredientModel { Name = "Italiaanse Ham", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var zachteGeitenkaas = new IngredientModel { Name = "Zachte Geitenkaas", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var gedroogdeVeenbessen = new IngredientModel { Name = "Gedroogde Veenbessen", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var gemsla = new IngredientModel { Name = "Gemsla", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var stilton = new IngredientModel { Name = "Stilton", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
if (!context.Ingredients.Any())
{
context.Ingredients.AddOrUpdate(
i => i.IngredientId,
italiaanseHam,
zachteGeitenkaas,
gedroogdeVeenbessen,
gemsla,
stilton
);
};
#region Recipes
var LittleGemsal = new RecipeModel
{
Name = "Little Gemsla",
Description = "Little Gemsla met geitenkaas, veenbessen, gedroogde ham en stilton",
ImageUrl = "http://google.com",
RecipeLines = new List<RecipeLine> {
new RecipeLine { Quantity = 1, UnitOfMeasure = plak, Ingredient = italiaanseHam },
new RecipeLine { Quantity = 100, UnitOfMeasure = gram, Ingredient = zachteGeitenkaas },
new RecipeLine { Quantity = 2, UnitOfMeasure = eetlepel, Ingredient = gedroogdeVeenbessen },
new RecipeLine { Quantity = 4, UnitOfMeasure = stuks, Ingredient = gemsla },
new RecipeLine { Quantity = 1, UnitOfMeasure = stuks, Ingredient = stilton },
}
};
if (!context.Recipes.Any())
{
context.Recipes.AddOrUpdate(
i => i.RecipeId,
LittleGemsal
);
};
#endregion
为了更新数据库,我使用程序包管理器控制台和命令:
Update-Database -Verbose -Force
我也为这个项目使用 LocalDb,做数据库管理器没有找到数据库。
您可以在成分 ID 字段上使用数据注释:
[数据库生成(DatabaseGeneratedOption.Identity)]
希望对您有所帮助。
在您定义模型的 IngredientModel class 中添加 ?在 int 之后如下所示:
public int? IngredientsId {get; set;}
这应该绕过允许您输入 null 的值(因此您可以检查它是否在您 运行 您的代码时输入了值)。
如果它正在输入 null,则删除数据注释 [Key]
。默认情况下,模型 class 中的第一行将是您的主键。
如果这不起作用,请改用此注释 [HiddenInput(DisplayValue = true)]
。
看了几个数据注释还是没有解决
我在使用 Microsoft SQL Server
时多次遇到这个问题,我按照相同的方法修复它。要解决此问题,请确保 Identity Specification 设置为 Yes。这是它的样子:
通过这种方式,列号通常会像主键一样自动递增。
HOW?: 右击包含列的table,选择设计、select 主键并在 列属性 window 中找到 标识规范 并将其设置为 Yes.
我一直在寻找一种方法来为 ASP.NET MVC 应用程序自动生成 ID。这是因为我在尝试更新数据库时遇到此错误:
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'IngredientId', table 'RecipeApplicationDb.dbo.IngredientModels';
这是模特:
public class IngredientModel
{
[Key]
public int IngredientId { get; set; }
[Required]
public string Name { get; set; }
}
这是控制器:
public class IngredientController : Controller
{
private RecipeApplicationDb db = new RecipeApplicationDb();
public ActionResult Index()
{
//var ingredients = db.Ingredients.Include(i => i.DefaultUOM);
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "IngredientId,Name,SeasonStartdate,SeasonEnddate")] IngredientModel ingredientModel)
{
if (ModelState.IsValid)
{
db.Ingredients.Add(ingredientModel);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.IngredientId = new SelectList(db.UnitOfMeasures, "UnitOfMeasureId", "Name", ingredientModel.IngredientId);
return View(ingredientModel);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
我认为解决这个问题的最好方法是使用 Linq 表达式来生成 IngredientId。 为此,我发现(除其他外)这个post:How do I use Linq to obtain a unique list of properties from a list of objects? 有人可以告诉我这是否是正确的解决方案,如果是这样,我应该把这段代码放在哪里。
提前致谢。
=============编辑=====================
我还创建了一个包含以下内容的配置文件:
#region Ingredienten
var italiaanseHam = new IngredientModel { Name = "Italiaanse Ham", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var zachteGeitenkaas = new IngredientModel { Name = "Zachte Geitenkaas", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var gedroogdeVeenbessen = new IngredientModel { Name = "Gedroogde Veenbessen", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var gemsla = new IngredientModel { Name = "Gemsla", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
var stilton = new IngredientModel { Name = "Stilton", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now };
if (!context.Ingredients.Any())
{
context.Ingredients.AddOrUpdate(
i => i.IngredientId,
italiaanseHam,
zachteGeitenkaas,
gedroogdeVeenbessen,
gemsla,
stilton
);
};
#region Recipes
var LittleGemsal = new RecipeModel
{
Name = "Little Gemsla",
Description = "Little Gemsla met geitenkaas, veenbessen, gedroogde ham en stilton",
ImageUrl = "http://google.com",
RecipeLines = new List<RecipeLine> {
new RecipeLine { Quantity = 1, UnitOfMeasure = plak, Ingredient = italiaanseHam },
new RecipeLine { Quantity = 100, UnitOfMeasure = gram, Ingredient = zachteGeitenkaas },
new RecipeLine { Quantity = 2, UnitOfMeasure = eetlepel, Ingredient = gedroogdeVeenbessen },
new RecipeLine { Quantity = 4, UnitOfMeasure = stuks, Ingredient = gemsla },
new RecipeLine { Quantity = 1, UnitOfMeasure = stuks, Ingredient = stilton },
}
};
if (!context.Recipes.Any())
{
context.Recipes.AddOrUpdate(
i => i.RecipeId,
LittleGemsal
);
};
#endregion
为了更新数据库,我使用程序包管理器控制台和命令:
Update-Database -Verbose -Force
我也为这个项目使用 LocalDb,做数据库管理器没有找到数据库。
您可以在成分 ID 字段上使用数据注释:
[数据库生成(DatabaseGeneratedOption.Identity)]
希望对您有所帮助。
在您定义模型的 IngredientModel class 中添加 ?在 int 之后如下所示:
public int? IngredientsId {get; set;}
这应该绕过允许您输入 null 的值(因此您可以检查它是否在您 运行 您的代码时输入了值)。
如果它正在输入 null,则删除数据注释 [Key]
。默认情况下,模型 class 中的第一行将是您的主键。
如果这不起作用,请改用此注释 [HiddenInput(DisplayValue = true)]
。
看了几个数据注释还是没有解决
我在使用 Microsoft SQL Server
时多次遇到这个问题,我按照相同的方法修复它。要解决此问题,请确保 Identity Specification 设置为 Yes。这是它的样子:
HOW?: 右击包含列的table,选择设计、select 主键并在 列属性 window 中找到 标识规范 并将其设置为 Yes.