我在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
答案 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;