EF 5, objet de mise à jour donne "Une violation de contrainte d'intégrité référentielle s'est produite"
Dans mon modèle, j'ai un tas d'objets du domaine. Maintenant, je vais avoir un problème lorsque vous essayez de mettre à jour un Utilisateur de l'objet. L'Utilisateur dispose d'une foreignkey ce qui concerne le Rôle de l'objet. Quand je l'ai mise à jour de l'Utilisateur de l'objet sans changeing la valeur foreignkey (FkRoleId) tout fonctionne très bien. Mais quand je change le rôle de l'utilisateur actuel je veux mettre à jour, je reçois l'erreur:
Une contrainte d'intégrité référentielle violation a eu lieu: La propriété
les valeurs qui définissent les contraintes référentielles ne sont pas compatibles
entre le principal et les objets qui en dépendent dans la relation.
Voici comment je mettre à jour mon-objet:
public void Update(User user)
{
using (var context = new DBEntities())
{
context.Entry(user).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
}
Comment puis-je mettre à jour mon objet sans l'obtention de cette exception?
Il doit y avoir un moyen pour chaning la valeur foreignkey pour mappen l'utilisateur à un autre rôle.
Voici mes classes de domaine dans ce cas:
public partial class User
{
public User()
{
this.Advertisers = new HashSet<Advertiser>();
this.Cases = new HashSet<Case>();
this.Materials = new HashSet<Material>();
}
public int PkId { get; set; }
public int FkRoleId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public System.DateTime Created { get; set; }
public bool Active { get; set; }
public virtual ICollection<Advertiser> Advertisers { get; set; }
public virtual ICollection<Case> Cases { get; set; }
public virtual ICollection<Material> Materials { get; set; }
public virtual Role Role { get; set; }
}
public partial class Role
{
public Role()
{
this.Users = new HashSet<User>();
}
public int PkId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<User> Users { get; set; }
}
source d'informationauteur Nicke
Vous devez vous connecter pour publier un commentaire.
À citer dans votre commentaire:
Oui, dans ce cas, il est.
Vous devez garder à l'esprit que vous entrez dans un nouveau contexte avec une certaine distance avec l'objet
user
(y compris la référence àuser.Role
). En définissant l'état deModified
vous attachez de l'objetuser
ainsi que leuser.Role
à ce nouveau contexte.Parce que vous êtes à l'aide d'une clé étrangère de l'association - ce qui signifie que la clé étrangère est représentée par une propriété
FkRoleId
dans la classe du modèle - la relation est décrite de deux façons: Par la propriété de navigationuser.Role
et par la propriété scalaireuser.FkRoleId
. Si elles ne sont pas cohérentes à - direuser.Role.PkId != user.FkRoleId
- EF ne sais pas où l'on décrit la relation correcte et lève l'exception que vous avez.Si vous définissez
user.Role
ànull
EF envisager lauser.FkRoleId
comme la seule propriété qui décrit la relation entre l'utilisateur et le rôle et l'ambiguïté qui a été l'origine de l'exception est supprimé.Pour le bénéfice des chercheurs, j'avais la même erreur, mais a trouvé une solution rapide.
J'ai été chargement d'une classe avec un FK relation dans la vue d'être édité. Même sans changement, le FK était coupée et que cette erreur s'est produite. Le correctif a été d'inclure un champ caché dans le Rasoir vue que contenait la FK. par exemple,
Code copié ci-dessous de sorte que vous pouvez vérifier si votre situation est similaire.
Actions De Contrôleur
Relations
Livre.cs
ReleaseInfo.cs