angularconsulting.au
angularconsulting.au

Reputation: 28259

EF Generic Repository get Id from new inserted generic entity

All my entities has property Id. All my tables in database has auto-generated integer identity Id as primary key.

I have generic method to Create entities.

Is there any way to get entity Id after entity inserted in to database?

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

        return <Id Here>; //TODO Return Id here
    }

In simple(not generic) repository i may just return Entity.Id, but how to get the same behavior in generic repository? I may have base entity class for all entities which contains int property Id but is there any way to get it work without implementing this inheritance?

Upvotes: 8

Views: 15478

Answers (4)

Charly Guirao
Charly Guirao

Reputation: 489

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

Upvotes: 2

GHP
GHP

Reputation: 3231

This can actually be dead 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"

Racked my brain on how to get the ID back for a long time until I realized that the above code works. Works in Linq-To-SQL and EF4.

Upvotes: 17

angularconsulting.au
angularconsulting.au

Reputation: 28259

The solution:

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

        //Returns primaryKey value
        return (TR)context.CreateEntityKey(entitySet, entity).EntityKeyValues[0].Value;                       
    }

Where T: entity type, TR: entity PK type.

Upvotes: 3

Craig Stuntz
Craig Stuntz

Reputation: 126547

With POCO entities, you'd have to use an interface, reflection, or dynamic.

With EntityObject entities you can read the EntityKey property.

Upvotes: 4

Related Questions