在EF5迁移中将字段定义为自动增量

时间:2012-12-25 19:29:59

标签: asp.net-mvc entity-framework

我正在使用EF迁移创建表格,例如:

this.CreateTable("Message",
            c => new
            {
                Id = c.Long(nullable: false, identity: true, defaultValue: 0),
                Subject = c.String(nullable: false, maxLength: 64),
                Body = c.String(nullable: false, isMaxLength: true)
            })
            .PrimaryKey(c => c.Id)
            .Index(c => c.Id, unique: true);

如何将Id字段定义为auto_increment?我很确定它必须是可能的,但我只是在努力寻找......

感谢。

2 个答案:

答案 0 :(得分:3)

好的,似乎在字段中设置属性“identity:true”应该足够了,但由于某种原因,该字段未定义为IDENTITY(1,1)。

在这篇文章中找到了一个解决方法:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/33db16ac-e166-455f-a47b-1e5fe0557979/

这对我有用:

Id = new ColumnModel(PrimitiveTypeKind.Int64) { IsNullable = false, IsIdentity = true },

现在它将列定义为IDENTITY(1,1)

答案 1 :(得分:1)

如果您确实想在代码中自动生成它,可以跳过Id字段上的注释并执行以下操作。

public abstract class AbstractContext : DbContext {

      /// <summary>
      /// Custom processing when saving entities in changetracker
      /// </summary>
      /// <returns></returns>
      public override int SaveChanges()
      {
          // recommended to explicitly set New Guid for appropriate entities
          foreach (var entry in ChangeTracker.Entries<ModelBase>().Where(e => e.State == EntityState.Added) ) {

              // only generate if property isn't identity...
              Type t = entry.Entity.GetType();
              var info = t.GetProperty("Id").GetCustomAttributes(
                  typeof(DatabaseGeneratedAttribute), true).Cast<DatabaseGeneratedAttribute>().Single();

              if (info.DatabaseGeneratedOption != DatabaseGeneratedOption.Identity) {
                  entry.Entity.Id = Guid.NewGuid(); // now we make it
              }
          }
          return base.SaveChanges();
      }

    }

有关详细信息,请查看Working with Entity Keys

我从上面显示的评论链接中得到了这个。

我希望这会对你有所帮助。