Shawn Shawn - 1 month ago 13
ASP.NET (C#) Question

Getting "The entity type <model> is not part of the model for the current context."

I am having this issue updating my database 1 column at a time in asp.net using web api. I am trying to query a PUT to just update one value in the row instead of updating that one and setting the rest to null. I made a separate model outside of the controller to take in the update so I could do one at a time. When I hit this line

db.Entry(user).State = EntityState.Modified;
in the controller that is where it is erroring out. Any advice how I can fix this?

This is my separate ViewModel I am taking in in the put method:

namespace WebAPI.Models.ViewModels
{
public class UserViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}


This is my controller calling in the method with the ViewModel in my parameter:

public HttpResponseMessage PutUser(int id, UserViewModel user)
{
HttpResponseMessage response;

if (db.User.IsInRole("Admin"))
{
try
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(id))
{
response = new HttpResponseMessage(HttpStatusCode.NotFound);
return response;
}
else
{
throw;
}
}

response = new HttpResponseMessage(HttpStatusCode.NoContent);
return response;
}


This is my
DBContext
file:

public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<User> Users { get; set; }
}
}

Answer

The error comes from how you initialize the data context db.

The user object has been created in a separate db, so, when you are trying to update user, the current db doesn't know about this user object.

You could solve it by getting a user

try
{
    // or check on FirstName and LastName if you don't have a user id
    var updatedUser = db.Users.SingleOrDefault(x => x.id == id);

    updatedUser.FirstName = user.FirstName;
    updatedUser.LastName = user.LastName;

    db.Entry(updatedUser).State = EntityState.Modified;
    db.SaveChanges();
 }

Alternatively, you could make sure that the data context you are using to create the user object is the same as the one that is trying to update the user.

Does this make sense to you?

Comments