我有一个实体Task
,其域类是
public class Task
{
public long TaskId { get; set; }
// blah blah
}
public DbSet<Task> Tasks { get; set; }
我希望TaskId
是主键和自动增量。因此我们有
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Task>().Property(x => x.TaskId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
}
现在我将数据添加到db
public bool AddTaskTable(int number,string[] params)
{
using (dbContext db = new dbContext())
{
var t = new Task { blah blah };
db.Tasks.Add(t);
try
{
db.SaveChanges();
return true;
}
我想要的是检索系统生成的TaskId
以供将来使用。例如,它是我想在另一个实体中使用它的外键。如何获得价值?
答案 0 :(得分:9)
我想,当你这样做时:
db.SaveChanges();
更改实际模型,并添加Id。因此,如果您在保存后阅读模型,它将显示已生成的更新ID。
借鉴此链中的其他答案,这与我的答案非常相关,并且是对我的实施的解释:
EF创建POCO(普通旧CLR对象)域模型。您的实体模型未处理,但它在内存中。您的新任务T已经在内存中,因此只要SaveChanges方法成功调用,您的对象也会包含自动生成的ID。
这是我的存储库实现:
public T Create<T>(T entity) where T : class
{
var newEntry = _dbContext.Set<T>().Add(entity);
_dbContext.SaveChanges();
return newEntry;
}
此处,实体已保存,并以新Id返回。
在您的实施中执行此操作:
public bool AddTaskTable(int number,string[] params)
{
using (dbContext db = new dbContext())
{
var t = new Task { blah blah };
var dbTask = db.Tasks.Add(t);
try
{
db.SaveChanges();
// task id
dbTask.taskId;
return true;
}
答案 1 :(得分:3)
保存更改后,应在实体上填充TaskId
属性。
如果在保存更改之前需要它(不是实际的Id,但需要将此对象用作外键属性),则需要使用导航属性,并为关系建模。
答案 2 :(得分:0)
我认为您可以在添加任务时检索TaskId
,如:
public int AddTaskTable(int number,string[] params)
{
using (dbContext db = new dbContext())
{
var t = new Task { blah blah };
db.Tasks.Add(t);
try
{
db.SaveChanges();
var newTaskId = dbContext
.Tasks
.OrderByDescending(x => x.TaskId)
.FirstOrDefault().TaskId;
return newTaskId;
}
}
}
它会给你TaskId
的确切值。
答案 3 :(得分:0)
EF创建POCO(普通旧CLR对象)域模型。您的实体模型未处理,但它在内存中。您的新任务T已经在内存中,因此只要成功调用 SaveChanges 方法,您的对象也会包含自动生成的ID。