【问题标题】:Get Id of Generic Entity of EF 6获取 EF 6 的通用实体的 ID
【发布时间】:2016-09-25 06:47:10
【问题描述】:

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

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

【问题讨论】:

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


【解决方案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.
}

【讨论】:

  • int 对于表标识来说非常短......所以为什么不长,因为它非常方便不用考虑未来的范围
  • 我也试过这个答案,但不是所有的 Table 都包含 Id 而是 TableId ..
  • 您的 EF 实体不必与您的数据库实体命名相同。您可以使用 [Column] 属性来指定它。
  • 另外,我没有写任何关于intlong 的内容,所以你的第一条评论可能是针对其他人的。
【解决方案2】:

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

1 我犯了一个错误,不是每个实体(表)都包含 id ..而是TableId

所以我的临时解决方案是返回实体并在添加到数据库后获取标识列的值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 2021-09-16
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多