[英]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!')
这是错误消息。
列名或提供的值数与表定义不匹配。
所以我的问题是:
谢谢。
问题的一部分是这个,特别是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.