我有一个创建新品牌的表单。用户为品牌选择名称,图像和网站URL并点击提交。编辑方案的工作方式相同。我遇到的问题是在创建一个新品牌时,正在发布正确的imageId,并且在我的操作中直到SaveChanges()正确。当我检查数据库中的新行时,ID已加倍,然后是一些。 (例如,如果我提交37,数据库将其更改为78,38到80等。)我很难过为什么会发生这种情况。这是我的行动:
[HttpPost]
public ActionResult NewBrand(Brand brand)
{
try
{
brand.BrandName = Request.Form["BrandName"];
brand.BrandImageId = int.Parse(Request.Form["Image.ImageId"]);
brand.BrandWebsite = Request.Form["BrandWebsite"];
_entities.Brands.AddObject(brand);
_entities.SaveChanges();
return RedirectToAction("Brands");
}
catch (Exception ex)
{
var script = "alert(" + ex.Message + ")";
return JavaScript(script);
}
}
这是来自萤火虫的示例POST
Parametersapplication/x-www-form-urlencoded
BrandName Sample Brand
BrandWebsite www.somewebsite.com
Image.ImageId 37
Source
Content-Type: application/x-www-form-urlencoded Content-Length: 72
BrandName=Sample+Brand&Image.ImageId=37&BrandWebsite=www.somewebsite.com
我正在使用实体框架并使用visual studio中的向导构建我的数据库。我的品牌表有外键ImageId,我有一个带有主键ImageId的图像表,它们有一对多的关系。有什么想法吗?
修改
我通过右键单击我的模型文件夹并添加一个新的.edmx文件来创建实体框架对象。然后我右键单击设计视图并点击“从数据库更新”,它从我创建的表中创建了一个模型。我没有做过任何特殊的配置或设置,我也没有使用存储库模式(是的,这意味着我的控制器中有数据访问代码,我在本周末进行重构),这是我在启动这个项目后学到的。
_entities来自控制器顶部的这一行
private MHNHubEntities _entities = new MHNHubEntities();
答案 0 :(得分:0)
ObjectContext
实现了IDisposable
,因此您没有正确使用MHNHubEntities
对象。尝试相应地修改您的代码,看看它是否解决了问题。
[HttpPost]
public ActionResult NewBrand(Brand brand)
{
try
{
brand.BrandName = Request.Form["BrandName"];
//brand.BrandImageId = int.Parse(Request.Form["Image.ImageId"]); // edited out
brand.BrandWebsite = Request.Form["BrandWebsite"];
using (var _entities = new MHNHubEntities())
{
// Edited in
brand.BrandImage = _entities.
BrandImages.
FirstOrDefault(i =>
i.Id == int.Parse(Request.Form["Image.ImageId"]));
_entities.Brands.AddObject(brand);
_entities.SaveChanges();
}
return RedirectToAction("Brands");
}
catch (Exception ex)
{
var script = "alert(" + ex.Message + ")";
return JavaScript(script);
}
}
答案 1 :(得分:0)
我最终通过使用图像ID查找图像,然后将该图像分配给BrandImage属性,而不是将ID分配给BrandImageID来解决问题,而BrandImageID正在向数据库中添加一个新的空白图像。