如何在最新的EF 6.1.3中的ID上添加标识种子

时间:2015-04-07 14:15:51

标签: c# entity-framework

请不要将此问题标记为重复的问题,因为我已检查过类似的问题,并且他们的错误消息和版本不相同。 他们中的许多人使用的是3年前的旧版本,所以我认为对于我正在使用的EF的最新版本,应该有一种不同的方式来实现我想要的。谢谢。

我正在尝试使用最新版本的EF 6.1.3创建一个表Event,(我首先使用代码)。

一切顺利,只有身份种子不适用于事件表上的ID属性。

这是我的代码:

  public class Event
    {
        public Event()
        {
            Organizers = new HashSet<AspNetUser>();
        }

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public string Id { get; set; }
        ....................

        public virtual ICollection<AspNetUser> Hosts {get; set;}
     }

在AspNetUser类中,我添加了以下代码行:

public class AspNetUser
{
     ................

     public AspNetUser()
            base:("theConnectionString")
     {
          Events = new HashSet<Event>();
     }

            public virtual ICollection<Event> Events {get; set;}

     ................
}

我更新了我的db上下文类中的OnModelCreating()方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AspNetRole>()
            .HasMany(e => e.AspNetUsers)
            .WithMany(e => e.AspNetRoles)
            .Map(m => m.ToTable("AspNetUserRoles").MapLeftKey("RoleId").MapRightKey("UserId"));

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.AspNetUserClaims)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.AspNetUserLogins)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<Event>()
            .HasMany(e => e.Organizers)
            .WithMany(e => e.Events)
            .Map(e => e.ToTable("AspNetUsers").MapLeftKey("UserId").MapRightKey("EventId"));

        modelBuilder.Entity<Event>()
            .Property(e => e.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }

正如您所看到的,最后两个块是我的代码。

然后我跑了:

  

添加迁移AddEventTable

     

更新的数据库的

生成的201504071252445_AddEventTable.cs如下所示:

public partial class AddEventTable : DbMigration
    {
        public override void Up()
        {
            RenameTable(name: "dbo.AspNetUsers", newName: "AspNetUsers1");
            CreateTable(
                "dbo.Events",
                c => new
                    {
                        Id = c.String(nullable: false, maxLength: 128),
                        Title = c.String(nullable: false, maxLength: 256),
                        Venue = c.String(),
                        StartDateTime = c.DateTime(nullable: false),
                        EndDateTime = c.DateTime(nullable: false),
                        Capacity = c.Int(nullable: false),
                        Content = c.String(),
                    })
                .PrimaryKey(t => t.Id);

            CreateTable(
                "dbo.AspNetUsers",
                c => new
                    {
                        UserId = c.String(nullable: false, maxLength: 128),
                        EventId = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => new { t.UserId, t.EventId })
                .ForeignKey("dbo.Events", t => t.UserId, cascadeDelete: true)
                .ForeignKey("dbo.AspNetUsers1", t => t.EventId, cascadeDelete: true)
                .Index(t => t.UserId)
                .Index(t => t.EventId);

        }

        public override void Down()
        {
            DropForeignKey("dbo.AspNetUsers", "EventId", "dbo.AspNetUsers1");
            DropForeignKey("dbo.AspNetUsers", "UserId", "dbo.Events");
            DropIndex("dbo.AspNetUsers", new[] { "EventId" });
            DropIndex("dbo.AspNetUsers", new[] { "UserId" });
            DropTable("dbo.AspNetUsers");
            DropTable("dbo.Events");
            RenameTable(name: "dbo.AspNetUsers1", newName: "AspNetUsers");
        }
    }

正如您所看到的,它在Up()中添加了一行不需要的代码:

RenameTable(name: "dbo.AspNetUsers", newName: "AspNetUsers1");

并在Down()

RenameTable(name: "dbo.AspNetUsers1", newName: "AspNetUsers");

我试图在不为ID提供值的情况下将值插入此表中,但它失败了:

这是sql查询

insert into Events values( 'Title', 'Address', '2015-04-09 20:00:00.000','2015-04-09 20:00:00.000', 30, 'Content!')

以下是错误消息。

  

列名或提供的值数与表不匹配   定义

所以我的问题是:

  1. 如何在我的事件ID上添加身份种子。
  2. 为什么生成的代码将我的AspNetUser表重命名为AspNetUser1?
  3. 谢谢。

1 个答案:

答案 0 :(得分:2)

您的部分问题是这一点,特别是Map()电话:

modelBuilder.Entity<Event>()
            .HasMany(e => e.Organizers)
            .WithMany(e => e.Events)
            .Map(e => e.ToTable("AspNetUsers").MapLeftKey("UserId").MapRightKey("EventId"));

您将Event类和AspNetUsers类之间的连接器映射到“AspNetUsers”表。这就是导致代码将现有表重命名为其他内容的原因。你也有倒映的映射。 MapLeftKey会引用Event表。 MapRightKey会引用AspNetUsers表。我会把它改成类似的东西(不必要的冗长,我知道,只是为了说明目的)

.Map(e => e.ToTable("AspNetUsersToEventsMapping")
           .MapLeftKey("EventId")
           .MapRightKey("UserId"))

问题的第二部分是您的Id字段是string。我不相信字符串字段可以是DatabaseGeneratedOption.Identity - 它应该是一个数值。