J'ai créé un ObjectSet Ce que je voudrais obtenir est le nom code> de l'entitékey de J'ai fouillé autour et creusé de profondes, mais je ne peux pas sembler trouver cette valeur nulle part dans la catégorie code> code>. p> générique
ObjectSet
dataContext.getObjectbey code>. p>
7 Réponses :
J'ai regardé il y a quelque temps pour une bonne façon de le faire et j'ai échoué à en trouver un. Je finis généralement à construire une méthode d'extension GetentitybyKey quelque part et dans cette mesure, des chaînes contaunantes pour créer des clés d'entité pour les appels de TrygetObjectBey. L'idée générale pour la construction de la clé d'entité va quelque chose comme ceci:
internal class Program { private static void Main(string[] args) { var dc = new AdventureWorksLT2008Entities(); object c; dc.TryGetObjectByKey(GetEntityKey(dc.Customers, 23), out c); var customer = c as Customer; Console.WriteLine(customer.EmailAddress); } private static EntityKey GetEntityKey<T>(ObjectSet<T> objectSet, object keyValue) where T : class { var entitySetName = objectSet.Context.DefaultContainerName + "." + objectSet.EntitySet.Name; var keyPropertyName = objectSet.EntitySet.ElementType.KeyMembers[0].ToString(); var entityKey = new EntityKey(entitySetName, new[] {new EntityKeyMember(keyPropertyName, keyValue)}); return entityKey; } }
voir Ce message que je fait concernant obtenir l'entitéNameName. Pour mon référentiel, je crée une propriété qui obtient le nom du jeu d'entité pour le nom de classe spécifique pour faire exactement ce que vous essayez de faire. P>
générique:
Cela devrait vous donner tous les arguments génériques (types) pour l'objetSet:
J'ai eu un moment difficile à essayer de faire presque la même chose, d'obtenir le nom de la clé principale et la valeur au moment de l'exécution lorsque le type est inconnu. J'aurais juste essayé d'essayer de mettre en œuvre un programme d'audit pour Supprêts et chaque solution que je trouve implique un code superflu que je ne comprends pas vraiment. L'entitékey n'est pas disponible auprès d'un dBContext, qui est également déroutant et gênant. Les 5 dernières lignes peuvent vous économiser 5 heures et 1 an de calvitie. Je ne tente pas cela pour les insertions, donc si vous le faites, vous devez inspecter ces valeurs soigneusement car elles peuvent être 0 ou null.
foreach(var entry in ChangeTracker.Entries<IAuditable>()) { ... case EntityState.Deleted: var oc = ((IObjectContextAdapter)this).ObjectContext; //this is a DbContext EntityKey ek = oc.ObjectStateManager.GetObjectStateEntry(entry.Entity).EntityKey; var tablename = ek.EntitySetName; var primaryKeyField = ek.EntityKeyValues[0].Key; //assumes only 1 primary key var primaryKeyValue = ek.EntityKeyValues[0].Value;
Et si vous n'avez pas de chanttracker.entre?
Dans mon cas, j'ai été accroché à l'événement Savechanges et je n'ai pas désactivé le suivi des changements. Si votre suivi de changement est désactivé, la réponse marquée devrait vous aider. Si votre suivi de changement n'est pas désactivé et que vous avez une poignée sur une entité, je penserais que vous pourriez subir cela dans ma deuxième ligne où je mets '(entrée.Entéity)'.
var objcontext = ((iobjectcontexttadapter) this.context) .ObjectContext; code>
var objset = objcontext.createObjectset
var ittitykey = objcontext.createentitykey (objset.entityset.name, entitytoupdate); code> p>
p> p>
var sort = objcontext.trygetObjectbykey (Entitykey, sortie de la fondé); code> p>
Testé avec EF 6.
Il retournera une gamme d'objets pour chaque valeur de clé primaire pour la DBentityENTrie donnée. p>
Leurs cas peut-être dans lesquels cela ne fonctionne pas - mais pour mes besoins simples Fonctionne génial. P>
J'espère que cela aide quelqu'un d'autre. p>