Reputation: 28259
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
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
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
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
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