如何在实体框架通用插入方法中返回插入记录的ID?

时间:2013-12-06 15:14:57

标签: entity-framework generics

这是通用插入方法。我需要你的建议来返回插入记录的ID。

public static void Create<T>(T entity) where T : class
{
    using (var context = new InformasoftEntities())
    {
        DbSet dbSet = context.Set<T>();
        dbSet.Add(entity);
        context.SaveChanges();
    }
}

3 个答案:

答案 0 :(得分:3)

Arturo Martinex的评论是正确的。

实体框架在SaveChanges期间修复了ID,因此它已在您传入方法的实体中更新。

要具体执行您的要求,您可以将通用约束从类更改为所有实体继承的新抽象类,该抽象类定义该类中的键。

   public static int Create<T>(T entity) where T : BaseEntity
    {
        using (var context = new InformasoftEntities())
        {
            DbSet dbSet = context.Set<T>();
            dbSet.Add(entity);
            context.SaveChanges();
            return entity.Id;
        }
    }

public abstract class BaseEntity
{
   int Id { get; set;}
}

此技术在InsertOrUpdate方法

中更有用

在泛型方法中使用键的另一种方法是查询MetaData,如下所述:

The key to AddOrUpdate

答案 1 :(得分:1)

您需要稍加修改:

  1. 您需要创建由实体

    实施的IHasAutoID
    public interface IHasAutoID {
        int getAutoId();
    }
    
  2. 在实体类

    public class EntityA : IHasAutoID {
    
        public int getAutoId() {
            return pk; // Return -1 If the entity has NO Auto ID
        }
    }
    
  3. 在您的创建功能

    public static int Create<T>(T entity) where T : class
    {
        using (var context = new InformasoftEntities())
        {
            DbSet dbSet = context.Set<T>();
            dbSet.Add(entity);
            context.SaveChanges();
    
            if (entity is IHasAutoID) {
                return ((IHasAutoID)entity).getAutoId();
            }
            return -1; // entity is NOT IHasAutoID)
        }
    }
    
  4. 注意:

    • 如果您确定所有表都具有名为“Id”的自动ID。您不需要创建Interface IHasAutoID。在Create函数中,在SaveChanges之后,使用REFLECTION获取Id属性的值,但不推荐这种方式!

答案 2 :(得分:-1)

public async Task<int> Add(TEntity entity)
{
 await _context.Set<TEntity>().AddAsync(entity);
 await Save();
 return Task.FromResult(entity).Id;
}
相关问题