C# 获取EF 6的通用实体的Id
我在EF中为CRUD编写了一个通用存储库C# 获取EF 6的通用实体的Id,c#,entity-framework,generics,entity-framework-6,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.S
public class GenericRepo<T> where T : class
{
//Create
public static void Add(CellPhoneProjectEntities dbContext, T entity)
{
dbContext.Set<T>().Add(entity);
dbContext.SaveChanges();
}
}
公共类GenericRepo其中T:class
{
//创造
公共静态void Add(CellPhoneProjectEntities dbContext,T entity)
{
dbContext.Set().Add(实体);
dbContext.SaveChanges();
}
}
如果我想获取实体的第一个元素(主键、标识列),则工作正常
公共静态长添加(CellPhoneProjectEntities dbContext、T实体、长id)
{
dbContext.Set().Add(实体);
dbContext.SaveChanges();
var pk=entity.ElementType.KeyMembers[0];
//类似于泛型的第一个元素
尽可能长的返回pk;
}
有人能帮忙在插入后获取实体的第一个元素(Id)吗
编辑:EF数据库优先,我的主键未命名为Id
相反,它是TableNameId,例如TableProjectMaster具有主键ProjectMasterId当您假设元素的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.
}
公共抽象类EntityBase
{
公共虚拟长Id{get;set;}
}
公共类MyEntity:EntityBase
{
[列(“表格ID”]
公共重写长Id{get;set;}
}
public long Add(DbContext context,T entity),其中T:EntityBase
{
var storedEntity=dbContext.Set().Add(实体);
dbContext.SaveChanges();
return storedEntity.Id;//将始终具有该属性。
}
尝试之后,我找到了一个临时解决方案。但仍然没有找到更好的答案
我犯了一个错误,不是每个实体(表)都包含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;
}
//创建///Get表的ID
公共静态T添加(CellPhoneProjectEntities数据库上下文,T实体,长id)
{
dbContext.Set().Add(实体);
dbContext.SaveChanges();
返回实体;
}
还有要拿到身份证
ServiceMaster master=some entity;;
long id=GenericRepo<ServiceMaster>Add(dbContext,master).ServiceMasterId;
ServiceMaster主机=某个实体;;
long id=GenericRepoAdd(dbContext,master).ServiceMasterId;
答案的可能重复项基于EF 4.1,但我在6.1.3中的EF可能会有所帮助:通用存储库,是模式滥用的缩写。int是表标识的缩写。所以为什么不长呢?因为它非常方便,不考虑未来的范围。我也尝试了这个答案,但不是所有表都包含Id而不是TableId。您的EF实体不必是named与您的DB实体相同。您可以使用[Column]属性来指定它。此外,我没有写任何关于int
vslong
,因此您的第一条评论可能是针对其他人的。
ServiceMaster master=some entity;;
long id=GenericRepo<ServiceMaster>Add(dbContext,master).ServiceMasterId;