6
votes

Comment obtenir l'objet d'objet Nom de l'entité d'entité?

J'ai créé un ObjectSet générique dans mon référentiel générique.

Ce que je voudrais obtenir est le nom de l'entitékey de ObjectSet afin que je puisse l'utiliser dans le dataContext.getObjectbey .

J'ai fouillé autour et creusé de profondes, mais je ne peux pas sembler trouver cette valeur nulle part dans la catégorie .


0 commentaires

7 Réponses :


6
votes

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;
    }
}


0 commentaires

1
votes

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.


0 commentaires

2
votes

générique: xxx


0 commentaires

1
votes

Cela devrait vous donner tous les arguments génériques (types) pour l'objetSet: xxx


0 commentaires

0
votes

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;


2 commentaires

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)'.



0
votes

var objcontext = ((iobjectcontexttadapter) this.context) .ObjectContext;

var objset = objcontext.createObjectset ();

var ittitykey = objcontext.createentitykey (objset.entityset.name, entitytoupdate);

var sort = objcontext.trygetObjectbykey (Entitykey, sortie de la fondé); xxx


0 commentaires

0
votes

Testé avec EF 6.

Il retournera une gamme d'objets pour chaque valeur de clé primaire pour la DBentityENTrie donnée.

Leurs cas peut-être dans lesquels cela ne fonctionne pas - mais pour mes besoins simples Fonctionne génial.

J'espère que cela aide quelqu'un d'autre. xxx


0 commentaires