在使用依赖注入时插入实体框架后获取标识值

时间:2017-11-20 14:09:51

标签: entity-framework dependency-injection asp.net-core-mvc

我在我的mvc核心应用程序中使用实体框架工作。我也在使用依赖注入技术。现在我想获得新记录标识列的值。我正在使用代码..

public interface IGenericRepositoryStudent<T> where T : class
{
    void Add(T item);
}

public class GenericRepositoryStudent<T> : IGenericRepositoryStudent<T> where T : class
{
    private eerp_studentContext _context;
    private DbSet<T> _dbSet;

    public GenericRepositoryStudent(eerp_studentContext context)
    {
        _context = context;
        _dbSet = _context.Set<T>();
    }

    public void Add(T item)
    {
        _dbSet.Add(item);
        _context.SaveChanges();
    }
}

控制器:

public class StudentController : Controller
{
    private IStudentRepository _dbSet;

    public StudentController(IStudentRepository dbSet)
    {
        _dbSet = dbSet;
    }

    public long Add([FromBody]Student _student)
    {
        if (ModelState.IsValid)
        {
            _dbSet.Add(acJournal);
            long _id = _student.id; // value of _id is always 0.
            return _id;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

显然,您要添加的每个T都有一个主键。在添加T并保存更改后,您需要此主键的值。

这意味着,您无法添加每个类的对象,您只能添加具有主键的类。

最简单,非常类型安全的方法(由编译器检查)是只允许添加具有主键的对象。

// interface of objects that have Id (primary key)
public interface IID
{
    public long Id {get; set;}
}

如果您的数据库使用其他类型的主键(如int或GUID),请将此其他类型用作返回类型

public interface IGenericRepositoryStudent<T> where T : IID
{
    T Add(T item);
}

 public class GenericRepositoryStudent<T> : IGenericRepositoryStudent<T> where T : IID
{
    ...
    public T Add(T itemToAdd)
    {
        T addedItem = _dbSet.Add(item);
        _context.SaveChanges();
        return addedItem
    }
}

用法:

class Student : IID
{
    public long Id {get; set;} // primary key
    ...
}

public class StudentController : Controller
{
    ...
    public T Add([FromBody]Student _student)
    {
        if (ModelState.IsValid)
        {
            return _dbSet.Add(_student);
        }
    }
}

我选择返回完整的T而不是仅返回ID,因为如果您需要添加项目的某些属性,则无需获取刚刚添加的项目。此外,这只是DbSet.Add(T)的返回值

如果你真的想要,只需退回学生的身份证。

相关问题