8
votes

Répertoire générique EF Get ID de nouvelle entité générique insérée

Toutes mes entités ont un identifiant de propriété. Toutes mes tables dans la base de données ont généré automatiquement l'ID d'identité entier généré comme clé primaire.

J'ai une méthode générique pour créer des entités.

existe-t-il un moyen d'obtenir une pièce d'identité après l'entité insérée dans la base de données? < / p> xxx

dans un référentiel simple (non générique), je peux simplement retourner une entité.Id, mais comment obtenir le même comportement dans le référentiel générique? Je peux avoir une classe d'entité de base pour toutes les entités qui contiennent une pièce d'identité de la propriété et y a-t-il un moyen de le faire fonctionner sans mettre en œuvre cette héritage?


0 commentaires

4 Réponses :


4
votes

avec des entités POCO, vous devez utiliser une interface, une réflexion ou dynamique .

avec entitéObject Entités Vous pouvez lire la propriété entitykey .


1 commentaires

Merci, l'interface est la meilleure façon, mais temporaire, je vais aller avec dynamique. 'Curycl-venture dynamique = entité;' 'Renvoie le courant actuel.



3
votes

La solution: xxx

où T: Type d'entité, TR: Entity Pk Type.


3 commentaires

Est-il possible d'obtenir l'identifiant avant d'appeler Savechanges?


@Jeen Il y a deux façons de faire cela, si vous souhaitez utiliser Int comme pk dans ce cas, vous devez d'abord insérer un enregistrement vide pour obtenir un nouvel ID généré par la base de données, autrui que vous pouvez utiliser le GUID comme pk, dans ce cas, dans ce cas, dans ce cas, vous pouvez Générez de la PK de votre code en appelant guid.newguid ()


S'il vous plaît montrer comment appeler votre créer () fonction qui retournera la valeur PK. Merci



16
votes

Ceci peut effectivement être mort simple;

// Project is is object/table, no POCO here.

var newProj = new Project();
newProj.Name = "Blah project";

var db = new AppDataContextname();

db.Projects.AddObject(newProj);

// at this point, newProj.ID is NOT set

db.SaveChanges(); // record is added to db.
// now, the ID property of the Project object is set!!!

// if the last ID in that table is '25', and you have auto-increment,
// then the object's ID property will now be 26!
Console.WriteLine(newProj.ID); // will output "26"


0 commentaires

2
votes
 With reflection you can obtain the Id property.


public override int Create<T>(T entity)
    {
        string entitySet = GetEntitySetName<T>();
        _context.AddObject(entitySet, entity);
        _context.SaveChanges();

         var idProperty = item.GetType().GetProperty("Id").GetValue(entity,null);
         return (int)idProperty;
    }

1 commentaires

Cela fonctionne mais il peut s'agir d'une traînée de performance. La réflexion est lente (de nombreuses arguments).