Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取EF 6的通用实体的Id_C#_Entity Framework_Generics_Entity Framework 6 - Fatal编程技术网

C# 获取EF 6的通用实体的Id

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

我在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();
        }
}
公共类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
vs
long
,因此您的第一条评论可能是针对其他人的。
ServiceMaster master=some entity;;
long id=GenericRepo<ServiceMaster>Add(dbContext,master).ServiceMasterId;