获取EF 6的通用实体的ID

时间:2016-09-25 06:47:11

标签: c# entity-framework generics entity-framework-6

我在EF中为CRUD编写了一个通用存储库。添加方法就是这样编写的

public class GenericRepo<T> where T : class
{
        //Create
        public static void Add(CellPhoneProjectEntities dbContext, T entity)
        {
            dbContext.Set<T>().Add(entity);
            dbContext.SaveChanges();
        }
}

工作正常我希望得到实体的第一个元素(主键,标识列)

public static long Add(CellPhoneProjectEntities dbContext, T entity,long id)
        {
            dbContext.Set<T>().Add(entity);
            dbContext.SaveChanges();

            var pk = entity.ElementType.KeyMembers[0];
            //Something like first elemnt by generic
            return pk as Long;
        }

任何人都可以帮助在插入后获得实体的第一个元素(Id)吗?

编辑:首先是EF数据库,我的主键没有命名为Id ..

而是TableNameId,例如。表 ProjectMaster 包含主键 ProjectMasterId

2 个答案:

答案 0 :(得分:1)

当您假设元素的ID是long时,它们是键的第一个元素,那么您将明确地进行非泛型假设。并非所有实体都有long密钥或密钥。

如果您有这个假设,最好在代码中明确明确。使用ID创建基本实体类,并确保所有实体都继承它。这样您就知道每个实体都有一个兼容的ID。如果您的表格列的名称不同,您可以使用[Column]属性在它们之间进行映射:

public abstract class EntityBase 
{
     public virtual long Id {get; set;}
}

public class MyEntity : EntityBase
{
    [Column("TableId"]
    public override long Id {get;set;}
}

public long Add(DbContext context, T entity) where T : EntityBase
{
    var storedEntity = dbContext.Set<T>().Add(entity);
    dbContext.SaveChanges();
    return storedEntity.Id; // Will always have the property.
}

答案 1 :(得分:0)

在尝试之后我找到了一个临时解决方案..但仍然没有找到更好的答案......

1错误我认为不是每个实体(表)都包含id ..而不是TableId

所以我的临时解决方案是返回实体并在添加到db之后获取identity列的值。

 //Create ///Get ID of the table
        public static T Add(CellPhoneProjectEntities dbContext, T entity, long id)
        {
            dbContext.Set<T>().Add(entity);
            dbContext.SaveChanges();
            return entity;
        } 

并获取ID

ServiceMaster master=some entity;;
long id=GenericRepo<ServiceMaster>Add(dbContext,master).ServiceMasterId;