问题
I'm building ASP.NET MVC2 application, and using Entity Framework as ORM. I am having troubles updating object in the database. Every time I try entity.SaveChanges(), EF inserts new line in the table, regardless of do I want update, or insert to be done. I tried attaching (like in this next example) object to entity, but then I got
{"An object with a null EntityKey value cannot be attached to an object context."}
Here's my simple function for inserts and updates (it's not really about vehicles, but it's simpler to explain like this, although I don't think that this effects answers at all)...
public static void InsertOrUpdateCar(this Vehicles entity, Cars car)
{
if (car.Id == 0 || car.Id == null)
{
entity.Cars.AddObject(car);
}
else
{
entity.Attach(car);
}
entitet.SaveChanges();
}
I even tried using AttachTo("Cars", car), but I got the same exception.
Anyone has experience with this?
回答1:
If you are updating an existing record then you should have the EntityKey within the object instance you are providing to your InsertOrUpdate method. Go back to your code and see if you can locate where this is getting lost. I'd suspect you are presenting the user with a form to update this object and then mapping the response fields back into a Car object but you aren't passing the EntityKey with it (you probably don't want to display it to the user).
What you'd need to do is to include the Key in the form using an input type of 'hidden'. You can use the Html helper Html.Hidden("Key field name", key field value) to ensure it's passed to the user form and then back to your Post code.
回答2:
I can give you a rough guide, but your code above doesn't give me a bunch to work with.
You would want to do something like:
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();
}
回答3:
Another approach that some might consider a little more elegant is:
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();
}
Put a break before and after repo.Commit();
and have your SQL query window open and run a select off the table before and after repo.Commit()
.
The add criteria are basically whatever you want them to be. Call repo.EntityToUpdate.Add(entity)
and repo.Commit()
.
来源:https://stackoverflow.com/questions/2720512/how-to-update-model-in-the-database-from-asp-net-mvc2-using-entity-framework