添加到数据库时ID值正在更改,与发布和提交的值不同

时间:2010-09-29 00:09:42

标签: sql asp.net-mvc entity-framework post firebug

我有一个创建新品牌的表单。用户为品牌选择名称,图像和网站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(); 

2 个答案:

答案 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正在向数据库中添加一个新的空白图像。