4

我正在使用 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?我很确定它必须是可能的,但我只是在努力找出......

谢谢。

4

2 回答 2

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)

于 2012-12-26T12:09:28.487 回答
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();
      }

    }

有关更多信息,请查看使用实体键

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

我希望这对你有帮助。

于 2012-12-26T07:05:12.147 回答