Gais
Gais

Reputation: 575

Updating an Entity with EF5

I have just started a new project and having had previous happy times with Entity Framework, I Nuget'ed in the latest version. All was going well until I tried to update an entity. I have the following code;

using (var c = new EFContext())
{
      Data.User u = new Data.User() { UserId = UserId };
      c.Users.Attach(u);
      u.FailedPasswordAttemptCount = newFailedPasswordAttemptCount;
      c.SaveChanges();
}

This worked fine in EF4. However in EF5 this craps out with a DbEntityValidationException as I have a non-nullable field in the user table (UserName).

I could solve this by creating my Data.User object with an empty UserName and telling EF which properties have been modified,

using (var c = new EFContext())
{
      Data.User u = new Data.User() { UserId = UserId, UserName = "" };
      ...
      c.Entry(u).Property("FailedPasswordAttemptCount ").IsModified = true;
      ...
}

but this doesn't seem particularly manageable as more non-nullable fields are added to this and numerous other tables.

This question states that Attach will only work for entities derived from EntityObject. So I assume EF5 objects do not derive from this.

Anyone know how I can update my entity without having to specify the all non-nullable string fields each time.

Feels like I am missing something really obvious....

Upvotes: 2

Views: 2876

Answers (1)

Justin Harvey
Justin Harvey

Reputation: 14672

If this is an existing user, you could just do this...

c.Users.First(user=>user.UserId == UserId).FailedPasswordAttemptCount =         newFailedPasswordAttemptCount;

c.SaveChanges(); 

By the way, as an aside, in EF5 code first, entity classes don't derive from anything, but can still be attached.

Or, you go back to your way of attaching, but I think you need to turn off validation for this save, as it seems EF only validates the whole entity or nothing

using (var c = new EFContext()) 
{       
    c.Configuration.ValidateOnSaveEnabled = false; 
    Data.User u = new Data.User() { UserId = UserId };       
    c.Users.Attach(u);       
    u.FailedPasswordAttemptCount = newFailedPasswordAttemptCount;       
    c.SaveChanges(); 
} 

Upvotes: 1

Related Questions