我在我的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;
}
}
}
答案 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)的返回值
如果你真的想要,只需退回学生的身份证。