在Entity Framework 6中获取标识值

时间:2014-04-21 13:14:31

标签: c# entity-framework

我有一个实体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以供将来使用。例如,它是我想在另一个实体中使用它的外键。如何获得价值?

4 个答案:

答案 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。