Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何使用实体框架从asp.net MVC2更新数据库中的模型?_Asp.net Mvc_Entity Framework_Asp.net Mvc 2 - Fatal编程技术网

Asp.net mvc 如何使用实体框架从asp.net MVC2更新数据库中的模型?

Asp.net mvc 如何使用实体框架从asp.net MVC2更新数据库中的模型?,asp.net-mvc,entity-framework,asp.net-mvc-2,Asp.net Mvc,Entity Framework,Asp.net Mvc 2,我正在构建ASP.NETMVC2应用程序,并使用实体框架作为ORM。更新数据库中的对象时遇到问题。每次尝试entity.SaveChanges()时,EF都会在表中插入新行,而不管我希望更新还是插入。我尝试将对象附加到实体(如下一个示例中所示),但后来我得到了 {"An object with a null EntityKey value cannot be attached to an object context."} 这是我的简单的插入和更新功能(这不是关于车辆的,但更简单的解释是这样的

我正在构建ASP.NETMVC2应用程序,并使用实体框架作为ORM。更新数据库中的对象时遇到问题。每次尝试entity.SaveChanges()时,EF都会在表中插入新行,而不管我希望更新还是插入。我尝试将对象附加到实体(如下一个示例中所示),但后来我得到了

{"An object with a null EntityKey value cannot be attached to an object context."}
这是我的简单的插入和更新功能(这不是关于车辆的,但更简单的解释是这样的,尽管我认为这一效果根本不起作用)

我甚至试着使用AttachTo(“Cars”,car),但我得到了同样的例外


任何人都有这方面的经验吗?

我可以给你一个粗略的指导,但你上面的代码并没有给我一大堆可供使用的东西

您可能希望执行以下操作:

using(Entities dataModel = new Entities())
{
    if(car.Id == 0 || car.Id == null)
    {
        dataModel.AddToCars(car); /* There should be a generated method similar to 
        this that just takes a car object minus the Primary Key */
    }
    else
    {
        var selectedCar = dataModel.Cars.Where(x => x.Id == car.Id).FirstOrDefault();

        if(selectedCar != null)
        {
            selectedCar.Name == car.Name; 
            // Continue updating your car stuff
        }
    }

    dataModel.SaveChanges();
}

我可以给你一个粗略的指导,但你上面的代码并没有给我一堆东西来使用

您可能希望执行以下操作:

using(Entities dataModel = new Entities())
{
    if(car.Id == 0 || car.Id == null)
    {
        dataModel.AddToCars(car); /* There should be a generated method similar to 
        this that just takes a car object minus the Primary Key */
    }
    else
    {
        var selectedCar = dataModel.Cars.Where(x => x.Id == car.Id).FirstOrDefault();

        if(selectedCar != null)
        {
            selectedCar.Name == car.Name; 
            // Continue updating your car stuff
        }
    }

    dataModel.SaveChanges();
}

如果要更新现有记录,则在为InsertOrUpdate方法提供的对象实例中应该有EntityKey。回到你的代码,看看你是否能找到丢失的地方。我怀疑您正在向用户提供一个表单来更新这个对象,然后将响应字段映射回一个Car对象,但是您没有将EntityKey传递给它(您可能不想向用户显示它)


您需要做的是使用“hidden”输入类型在表单中包含键。您可以使用Html helper Html.Hidden(“Key field name”,Key field value)来确保将其传递给用户表单,然后返回到您的邮政编码。

如果您正在更新现有记录,那么您应该在为InsertOrUpdate方法提供的对象实例中拥有EntityKey。回到你的代码,看看你是否能找到丢失的地方。我怀疑您正在向用户提供一个表单来更新这个对象,然后将响应字段映射回一个Car对象,但是您没有将EntityKey传递给它(您可能不想向用户显示它)


您需要做的是使用“hidden”输入类型在表单中包含键。你可以使用HTML助手HTML。隐藏(“关键字段名称”,关键字字段值)来确保它被传递给用户表单,然后返回到你的邮政编码。

< P>另一个可能会更优雅的方法是:

IContext context = ContextFactory.GetContext();
EntityRepo repo = new EntityRepo(context); //Entity Repository
OtherTableEntity y = new OtherTableEntity() //this could be some other derived value you already have 
//that uniquely identifies the record (or foreign key or other value you want to update)
Int32 id = 1234; //value to update to
var z = repo.TableToUpdate.List().Where(x => x.FK_ID == y.FK_ID).FirstOrDefault();
if (z != null)
{
     z.FK_ID = id;
     repo.Commit();
 }
repo.Commit()前后放一个中断符
并打开SQL查询窗口,在
repo.Commit()之前和之后从表中运行select


add标准基本上是您想要的。调用<代码> ReP.EntTyToupDead。添加(实体)<代码> >代码> RePo(提交)(< /代码> .< /P> < P>)另一些可能会考虑更优雅的方法是:

IContext context = ContextFactory.GetContext();
EntityRepo repo = new EntityRepo(context); //Entity Repository
OtherTableEntity y = new OtherTableEntity() //this could be some other derived value you already have 
//that uniquely identifies the record (or foreign key or other value you want to update)
Int32 id = 1234; //value to update to
var z = repo.TableToUpdate.List().Where(x => x.FK_ID == y.FK_ID).FirstOrDefault();
if (z != null)
{
     z.FK_ID = id;
     repo.Commit();
 }
repo.Commit()前后放一个中断符
并打开SQL查询窗口,在
repo.Commit()之前和之后从表中运行select


add标准基本上是您想要的。调用
repo.EntityToUpdate.Add(entity)
repo.Commit()

好吧,我以前考虑过这种方法,但它似乎是一种“变通方法”,我想使用一些更好、更传统的方法。然而,你的答案是有用的。谢谢,现在开始投票。我尝试了此解决方法,但再次失败,出现异常消息:“操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。“这听起来像是一个关于如何定义模式以及EF数据模型生成器如何从模式生成代码的问题。我会确保所有关系都在edmx中定义良好,并且在数据模型中添加/更新实体时,这些关系中的每一个都有适当的数据。这是EF的阴暗面。我以前也想过这种方法,但它似乎是一种“变通方法”,我想使用一些更好、更传统的方法。然而,你的答案是有用的。谢谢,现在开始投票。我尝试了此解决方法,但再次失败,出现异常消息:“操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。“这听起来像是一个关于如何定义模式以及EF数据模型生成器如何从模式生成代码的问题。我会确保所有关系都在edmx中定义良好,并且在数据模型中添加/更新实体时,这些关系中的每一个都有适当的数据。这是EF的阴暗面。是的,我有强类型视图,我有HttpPost方法,可以从该表单中获取Car对象。PK在那个里并且是正确的(我已经使用了隐藏字段),但EntityKey是空的。我不知道为什么会丢失,也不知道在哪里:SForgot更新。。。这就是问题所在。需要对具有相同实体键的对象进行更改和保存。是的,我有强类型视图,我有从该表单获取Car对象的HttpPost方法。PK在那个里并且是正确的(我已经使用了隐藏字段),但EntityKey是空的。我不知道为什么会丢失,也不知道在哪里:SForgot更新。。。这就是问题所在。需要对具有相同实体键的对象进行更改和保存。