EF Generic Repository从新插入的通用实体获取Id

时间:2010-08-23 13:23:14

标签: c# asp.net entity-framework-4

我的所有实体都有属性ID。数据库中的所有表都将自动生成的整数标识Id作为主键。

我有创建实体的通用方法。

在将实体插入数据库后,有没有办法获取实体ID?

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

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

在简单(非通用)存储库中,我可能只返回Entity.Id,但如何在通用存储库中获得相同的行为?  我可能有包含int属性Id的所有实体的基本实体类,但有没有办法让它工作而不实现这个继承?

4 个答案:

答案 0 :(得分:16)

这实际上可能很简单;

// 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"

在我意识到上述代码有效之前,我已经知道了如何将ID恢复很长时间。适用于Linq-To-SQL和EF4。

答案 1 :(得分:4)

使用POCO实体,您必须使用界面,反射或dynamic

使用EntityObject个实体,您可以阅读EntityKey属性。

答案 2 :(得分:3)

解决方案:

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

其中T:实体类型,TR:实体PK类型。

答案 3 :(得分:1)

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