web-dev-qa-db-fra.com

La propriété 'nom' fait partie des informations clés de l'objet et ne peut pas être modifiée. Cadre d'entité

J'essaie de mettre à jour un enregistrement et j'obtiens ce message d'erreur après la context.SaveChanges();

La propriété 'nom' fait partie des informations clés de l'objet et ne peut pas être modifiée.

Voici le code pour la fonction de mise à jour:

 if (context.EAT_SourceNames.Any(e => e.name == newSourceName))
 {
    MessageBox.Show("Name already exists in the Database");
 }
 else
 {
    var nameToUpdate = context.EAT_SourceNames.SingleOrDefault(e => e.name == sourceName.name);
    if (nameToUpdate != null)
    {
       nameToUpdate.name = newSourceName;
       context.SaveChanges();
       RefreshDGVs();
     }
 }

Ma classe SourceNames se présente comme suit:

    public EAT_SourceNames()
    {
        this.EAT_Sources = new ObservableListSource<EAT_Sources>();
    }

    public string name { get; set; }
    public string version_id { get; set; }
    public string allocation_name { get; set; }

J'ai cherché des questions similaires, mais je n'ai trouvé aucune solution efficace.

14
forgetaboutme

Voir la réponse de yildizm85 à cette question: le cadre de l’entité ne fonctionne pas sur une table sans colonne d’identité

"Entity Framework nécessite une clé primaire pour générer un modèle à partir de la base de données. S'il n'y a pas de clé primaire dans une table, il sélectionnera simplement les colonnes non nullables comme clé primaire concaténée et l'entité sera en lecture/lecture seule."

En examinant votre objet EAT_SourceNames, vous constaterez qu'il n'y a pas de champ de clé primaire. Entity Framework utilise donc la colonne 'nom' comme partie intégrante de la clé composite, ce qui signifie qu'elle est en lecture seule.

La solution serait d'ajouter un champ de clé primaire à EAT_SourceNames, puis votre champ "nom" ne ferait plus partie de la clé primaire.

32
nvuono

La même chose m'est arrivée aujourd'hui. J'ai défini l'identifiant de la nouvelle entité avec l'identifiant de l'ancien enregistrement et l'erreur a disparu.

//This checks whether there's a record with same specific data.
var kayitVarMi = _db.Sorgu.FirstOrDefault(a => a.Serial == sorgu.Serial);

                if (kayitVarMi != null) // If there's
                {
                    sorgu.Id = kayitVarMi.Id; //This one does the trick
                    _db.Entry(kayitVarMi).CurrentValues.SetValues(sorgu);
                }
                else // If not
                {
                    _db.Sorgu.Add(sorgu);
                }

                // This whole block is in a transaction scope so I just check recordability.
                if (_db.SaveChanges() > 0)
                {
                    _sorguKaydedildiMi = true;
                }
7
Doğa Gençer

La seule façon pour moi de mettre à jour une clé primaire textuelle consiste à utiliser les éléments suivants.

Je ne crois pas que la meilleure pratique consiste à utiliser une clé primaire "fonctionnelle". Le but d'une clé primaire est simplement d'identifier de manière unique une ligne.

context.Database.ExecuteSqlCommand("UPDATE Table SET [Name] = {0} WHERE [Name] = {1}", nameProperty, oldNameProperty);
3
Cyberdrew

Voici la solution appropriée.

Vous devez décocher la clé d'entité de Nom de votre EAT_SourceNames.

Vous pouvez le faire en procédant comme suit.

  1. Ouvrez votre fichier .edmx.
  2. Faites un clic droit sur votre affichage et sélectionnez Détails de la cartographie. 
  3. Cliquez sur Navigateur de modèles et vous le trouverez à droite de votre écran.
  4. Maintenant, dans ce dossier, allez dans le dossier Types d'entités et cliquez sur votre table dans votre cas EAT_SourceName.
  5. Maintenant, vous trouverez le modèle de EAT_SourceName, maintenant un clic droit sur le nom et décochez Entity Keys.
  6. Maintenant, nettoyez et reconstruisez votre solution.
2
Neel Darji

name est probablement une clé primaire partielle ou complète pour votre entité EAT_SourceNames . Vous ne pouvez pas modifier la PK de l'objet, est-ce la limitation de EF (voir ceci thread ).

2
Yura

Le fait est que vous travaillez avec un objet. La propriété "name" identifie l'objet, c'est pourquoi vous ne pouvez pas le modifier ... La solution consiste à modifier la valeur de la table avec une instruction SQL (UPDATE) et à recharger le contexte ... ".

0
Patrick Fredin