Asp.net mvc 如何使用实体框架从asp.net MVC2更新数据库中的模型?
我正在构建ASP.NETMVC2应用程序,并使用实体框架作为ORM。更新数据库中的对象时遇到问题。每次尝试entity.SaveChanges()时,EF都会在表中插入新行,而不管我希望更新还是插入。我尝试将对象附加到实体(如下一个示例中所示),但后来我得到了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."} 这是我的简单的插入和更新功能(这不是关于车辆的,但更简单的解释是这样的
{"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更新。。。这就是问题所在。需要对具有相同实体键的对象进行更改和保存。