Je rencontre ce problème en mettant à jour ma colonne de base de données 1 à la fois en asp.net à l'aide de l'API Web. J'essaie d'interroger un PUT pour mettre à jour une valeur de la ligne au lieu de la mettre à jour et de définir le reste sur null. J'ai créé un modèle séparé en dehors du contrôleur pour prendre en compte la mise à jour afin que je puisse le faire un à la fois. Lorsque je frappe cette ligne db.Entry(user).State = EntityState.Modified;
dans le contrôleur, c'est là où il y a une erreur. Des conseils pour résoudre ce problème?
Voici mon ViewModel séparé que je prends dans la méthode put:
namespace WebAPI.Models.ViewModels
{
public class UserViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
Voici comment mon contrôleur appelle la méthode avec ViewModel dans mon paramètre:
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;
}
Ceci est mon fichier DBContext
:
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; }
}
}
L'erreur provient de la façon dont vous initialisez le contexte de données db
.
L'objet utilisateur a été créé dans une db
distincte. Ainsi, lorsque vous essayez de mettre à jour user
, la base de données actuelle ne connaît pas cet objet user
.
Vous pouvez le résoudre en obtenant un utilisateur
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();
}
Vous pouvez également vous assurer que le contexte de données que vous utilisez pour créer l'objet user
est identique à celui qui tente de mettre à jour l'utilisateur.
Cela vous semble-t-il logique?
Cela se produit toujours si votre référentiel doit accéder de manière dynamique à différents DbContext Entity Framework, ce qui signifie différentes bases de données.
Vérifiez votre chaîne de connexion de données dans le fichier web.config pour chaque DbContext Entity Frmework.
Par exemple:
<add name="CRMEntities" connectionString="metadata=res://*/CRMEntities.csdl|res://*/CRMEntities.ssdl|res://*/CRMEntities.msl;provider=System.Data.SqlClient;provider connection string="data source=Your Data Source;initial catalog=CRM;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
vérifiez les métadonnées dans connectionString si elles pointent vers un DbContext correct.
Dans cet exemple, il pointe vers un fichier demx appelé "CRMEntities".
Assurez-vous que la bonne partie de métadonnées doit être identique à celle d’edmx.
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;"
Votre modèle de vue n'est pas un objet utilisateur pleinement qualifié. En tant que tel, vous devrez en obtenir un.
Cet appel, db.User.IsInRole("Admin")
, semble indiquer que vous avez déjà l'utilisateur actuel. Vous devriez simplement modifier celui-là, puis le soumettre aux modifications.
try
{
db.User.FirstName = user.FirstName;
db.User.LastName = user.LastName;
db.Entry(db.User).State = EntityState.Modified;
db.SaveChanges();
}
Cela m'est arrivé parce que quelqu'un a créé une nouvelle chaîne de connexion dans app.config en effectuant un copier-coller depuis un existant.
Le résultat ressemblait à ceci:
<connectionStrings>
<add
name="Db1Context"
connectionString="metadata=res://*/Db1Context.csdl|res://*/Db1Context.ssdl|res://*/Db1Context.msl;..."
providerName="System.Data.EntityClient"
/>
<add
name="Db2Context"
connectionString="metadata=res://*/Db1Context.csdl|res://*/Db1Context.ssdl|res://*/Db1Context.msl;..."
providerName="System.Data.EntityClient"
/>
</connectionStrings>
Notez que Db2Context fait toujours référence à DbContext1 dans ses métadonnées ...
J'ai aussi eu cette exception. Je l'ai résolu en effectuant un clic droit sur le modèle Entity.edmx dans le diagramme et en actualisant la connexion à ma base de données via "Update Model From Database".
Je ne sais pas pourquoi cela a fonctionné, mais cela a fonctionné, du moins dans mon cas.
J'ai eu le même problème de recevoir l'exception lorsque j'ai essayé d'ajouter une instance de ma classe au DbSet. Mon problème était que la définition de la table dans la base de données ne correspondait pas à mon objet exact (2 propriétés non nulles manquaient dans mon modèle). J'ai ajouté les deux propriétés à ma classe et l'erreur a disparu.
Vérifiez que le serveur est en 64 ou 32 bits et recompilez l'application.
J'ai eu le même problème. Mon problème était que je ne mettais aucun mappage Entity/Table. Après avoir mappé mon entité, le problème a été résolu.