繁体   English   中英

如何在最新的EF 6.1.3中的ID上添加身份种子

[英]How to add identity seed on the ID in the latest EF 6.1.3

请不要将此问题标记为重复的问题,因为我已经检查过类似的问题,并且它们的错误消息和版本也不相同。 他们中的许多人使用的可能是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;}

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

我在数据库上下文类中更新了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);
    }

如您所见,最后2个块是我的代码。

然后我跑了:

添加迁移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?

谢谢。

问题的一部分是这个,特别是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它应该是一个数字值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM