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.
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.
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;
}
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);
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.
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 ).
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 ... ".