代码之家  ›  专栏  ›  技术社区  ›  angularconsulting.au

EF通用存储库从新插入的通用实体获取Id

  •  8
  • angularconsulting.au  · 技术社区  · 14 年前

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

    在实体插入到数据库之后,有没有办法获得实体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
        }
    

    在简单(非通用)存储库中,我可能只返回实体Id,但如何在通用存储库中获得相同的行为? 对于包含int属性Id的所有实体,我可能都有一个基本实体类,但是有没有任何方法可以让它在不实现这个继承的情况下工作呢?

    4 回复  |  直到 12 年前
        1
  •  16
  •   GHP    11 年前

    这其实非常简单;

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

    我绞尽脑汁想了很长一段时间,直到我意识到上面的代码是有效的。在linqtosql和EF4中工作。

        2
  •  4
  •   Craig Stuntz    14 年前

    对于POCO实体,必须使用接口、反射或 dynamic .

    EntityObject EntityKey

        3
  •  3
  •   angularconsulting.au    14 年前

     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类型。

        4
  •  1
  •   Charly Guirao    10 年前
     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;
        }